@NewSantaClaus

Как рекурсивно обойти объект и выполнить get_object_vars?

Есть некий класс, в который вносятся данные.

Задача. после внесения всех данных этот экземпляр класса нужно преобразовать в json.

Пример класса:
class Text
{

    protected string $text;

    protected Text $children;

    protected string $type = "text";

    public function setText(string $text): self
    {
        $this->text = $text;
        return $this;
    }

    public function setChildren(Text $children): self
    {
        $this->children = $children;
        return $this;
    }

    public function expose()
    {
        return get_object_vars($this);
    }
}


Когда я делаю вот так, то все как бы хорошо
$text = (new Text())->setText("text");
     echo json_encode($text->expose());
     // {"text":"text","type":"text"}


Но как только я указываю children
$text2 = (new Text())->setText("text")->setChildren($text);
     echo json_encode($text2->expose());
     // {"text":"text","children":{},"type":"text"}


То внутренний объект не форматируется, в свойстве children находится пустота
Как это исправить?

Песочница здесь
  • Вопрос задан
  • 130 просмотров
Решения вопроса 1
0xD34F
@0xD34F
public function expose() {
  return array_map(fn($n) => $n instanceof Text ? $n->expose() : $n, get_object_vars($this));
}
Ответ написан
Пригласить эксперта
Ответы на вопрос 1
Rsa97
@Rsa97
Для правильного вопроса надо знать половину ответа
Вместо get_object_vars использовать явное формирование массива свойств с рекурсивным вызовом expose для дочернего объекта.
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы