PHP-нерекурсивный дамп var?


Имея дело с определенными объектами PHP, можно сделать var_dump() и PHP выводит значения на экран, которые продолжаются и продолжаются, пока не будет достигнут предел памяти PHP, я полагаю. Примером этого является сброс простого объекта HTML DOM. Я предполагаю, что поскольку вы можете пересекать детей и родителей объектов, то выполнение var_dump() дает бесконечные результаты, потому что оно находит родителя объекта, а затем рекурсивно находит его детей, а затем находит всех родителей этих детей и находит эти дети и т. д. Это будет продолжаться и продолжаться.

Мой вопрос в том, как можно избежать этого и удержать PHP от рекурсивного сброса одних и тех же вещей снова и снова? Используя простой пример HTML DOM parser, если у меня есть объект DOM, у которого нет детей, и я var_dump() его, я бы хотел, чтобы он просто сбросил объект и не начинал переход вверх по дереву DOM и сбрасывал родителей, бабушек и дедушек, других детей и т. д.

2 9

2 ответа:

Установите расширение XDebug в среде разработки. Он заменяет var_dump своим собственным, который по умолчанию содержит только 3 члена.

Https://xdebug.org/docs/display

Он будет отображать элементы глубиной 4 уровня в виде многоточия. Глубину можно изменить с помощью параметра ini.

Все функции PHP: var_dump, var_export и print_r не отслеживают рекурсию / циклические ссылки.

Правка:

Если вы хотите сделать это трудным способом, вы можете написать свой собственная функция

print_rr($thing, $level=0) {
   if ($level == 4) { return; }
   if (is_object($thing)) {
       $vars = get_object_vars($thing);

   }

   if (is_array($thing)) {
       $vars = $thing;
   }
   if (!$vars) {
       print " $thing \n";
       return;
   }

   foreach ($vars as $k=>$v) {
      if (is_object($v)) return print_rr($v, $level++);
      if (is_array($v)) return print_rr($v, $level++);
      print "something like var_dump, var_export output\n";
   }
}

Почему бы вам просто не запустить цикл foreach для вашего объекта?

Из PHP docs:

Конструкция foreach предоставляет простой способ перебора массивов. foreach работает только с массивами (и объектами ) и выдает ошибку при попытке использовать его для переменной с другим типом данных или неинициализированная переменная.