PHP - 非递归的 var_dump?

10
处理某些PHP对象时,可能会使用var_dump(),PHP将值输出到屏幕上,直到达到PHP内存限制。一个这样的例子是dump一个Simple HTML DOM对象。我认为,因为您可以遍历对象的子对象和父对象,所以执行var_dump()会给出无限的结果,因为它找到对象的父对象,然后递归地查找它的子对象,再找到所有那些子对象的父对象,并找到那些子对象,等等等等。它将一直进行下去。
我的问题是,如何避免这种情况,并防止PHP重复地递归地转储同样的内容?使用Simple HTML DOM解析器的示例,如果我有一个没有子元素的DOM对象,并且我var_dump()它,我希望它只转储该对象,而不是开始遍历DOM树并转储父对象、祖先对象、其他子对象等。

1
http://www.php.net/manual/en/function.var-dump.php#99765 - Gerry
3个回答

5

在您的开发环境中安装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";
   }
}

有没有不涉及xdebug的方法? - Nicholas Shanks
@NicholasShanks 不行,除非你自己编写并跟踪深度。 - chugadie

0

为什么不在您的对象上简单地运行foreach循环呢?

来自PHP文档

foreach结构提供了一种简单的方法来迭代数组。foreach仅适用于数组(和对象),当您尝试在具有不同数据类型或未初始化变量的变量上使用它时,它会发出错误。


真的吗?当我尝试将stdClass发送到foreach时,PHP总是给我一个提示。您可以使用哪些对象来限制它? - animuson
http://www.if-not-true-then-false.com/2009/php-tip-convert-stdclass-object-to-multidimensional-array-and-convert-multidimensional-array-to-stdclass-object/ - Ilia Choly
@animuson,你能贴出一个例子吗?我从未遇到过这样的问题。 - yoda
1
@yoda:这只是标准的“foreach期望参数1为数组”或类似的错误。我总是需要先将stdClass强制转换为数组,然后再将其发送到foreach中以消除警告。 - animuson
现在我知道了,我会尝试找出我代码中出现问题的地方,并发布一个问题来询问为什么会这样做... - animuson
foreach "技术上" 需要一个数组。如果你想浪费很多时间并编写糟糕的代码,请打开通知。 - Danial

0
我遇到了这个问题,并不需要查看对象内部,只需知道对象的类名,因此我编写了一个简单的函数,在转储数据之前将对象替换为其类名:
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))

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接