10

在处理某些 PHP 对象时,可以执行 avar_dump()并且 PHP 会不断地在屏幕上打印值,直到达到我假设的 PHP 内存限制。一个例子是转储一个简单的 HTML DOM 对象。我假设因为您能够遍历对象的子对象和父对象,所以这样做var_dump()会产生无限的结果,因为它会找到对象的父对象,然后递归地找到它的子对象,然后找到所有这些子对象的父对象并找到那些子对象,等等等等。它会一直持续下去。

我的问题是,你怎么能避免这种情况并防止 PHP 递归地反复倾倒相同的东西?使用简单的 HTML DOM 解析器示例,如果我有一个没有子对象的 DOM 对象var_dump(),我希望它只是转储对象而不开始遍历 DOM 树并转储父母、祖父母、其他孩子等.

4

3 回答 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";
   }
}
于 2016-08-10T14:25:10.610 回答
0

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

来自PHP 文档

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

于 2011-09-01T01:16:29.040 回答
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))
于 2019-05-03T21:37:31.963 回答