繁体   English   中英

PHP - 非递归var_dump?

[英]PHP - non-recursive var_dump?

在处理某些PHP对象时,可以执行var_dump()并且PHP将值打印到屏幕上,然后继续打开,直到达到PHP内存限制为止。 一个例子是转储Simple HTML DOM对象。 我假设因为你能够遍历对象的子对象和父对象,所以做var_dump()会给出无限的结果,因为它找到一个对象的父对象,然后递归地找到它的子对象然后找到所有这些孩子的父对象并找到那些孩子等等。等等。它会继续下去。

我的问题是,你怎么能避免这种情况并让PHP不要一遍又一遍地倾销掉同样的东西? 使用Simple HTML DOM解析器示例,如果我有一个没有子节点的DOM对象而且我有var_dump()它,我希望它只是转储对象而没有开始遍历DOM树并转储父母,祖父母,其他孩子等

在开发环境中安装XDebug扩展。 它将var_dump替换为自己的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文档

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

我遇到了这个问题并且不需要查看对象内部,只需要查看对象类名,因此我在转储数据之前编写了一个简单的函数来替换对象及其类名:

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))

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM