PHP - нерекурсивный var_dump? - PullRequest
       20

PHP - нерекурсивный var_dump?

9 голосов
/ 01 сентября 2011

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

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

Ответы [ 3 ]

5 голосов
/ 10 августа 2016

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

https://xdebug.org/docs/display

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

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

Edit:

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

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";
   }
}
1 голос
/ 01 сентября 2011

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

Из PHP документов :

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

0 голосов
/ 04 мая 2019

У меня была эта проблема, и мне не нужно было видеть внутри объектов, только имена классов объектов, поэтому я написал простую функцию для замены объектов их именами классов перед сохранением данных:

function sanitizeDumpContent($content)
{
    if (is_object($content)) return "OBJECT::".get_class($content);

    if (!is_array($content)) return $content;

    return array_map(function($node) {
        return $this->sanitizeDumpContent($node);
    }, $content);
}

Затем, когда вы хотите что-то сбросить, просто сделайте это:

var_dump(sanitizeDumpContent($recursive_content))
...