PHP-нерекурсивный дамп var?
Имея дело с определенными объектами PHP, можно сделать var_dump()
и PHP выводит значения на экран, которые продолжаются и продолжаются, пока не будет достигнут предел памяти PHP, я полагаю. Примером этого является сброс простого объекта HTML DOM. Я предполагаю, что поскольку вы можете пересекать детей и родителей объектов, то выполнение var_dump()
дает бесконечные результаты, потому что оно находит родителя объекта, а затем рекурсивно находит его детей, а затем находит всех родителей этих детей и находит эти дети и т. д. Это будет продолжаться и продолжаться.
Мой вопрос в том, как можно избежать этого и удержать PHP от рекурсивного сброса одних и тех же вещей снова и снова? Используя простой пример HTML DOM parser, если у меня есть объект DOM, у которого нет детей, и я var_dump()
его, я бы хотел, чтобы он просто сбросил объект и не начинал переход вверх по дереву DOM и сбрасывал родителей, бабушек и дедушек, других детей и т. д.
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 работает только с массивами (и объектами ) и выдает ошибку при попытке использовать его для переменной с другим типом данных или неинициализированная переменная.