【问题标题】:PHP - non-recursive var_dump?PHP - 非递归 var_dump?
【发布时间】:2011-11-08 01:48:02
【问题描述】:

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

我的问题是,如何避免这种情况并防止 PHP 以递归方式反复转储相同的内容?使用简单的 HTML DOM 解析器示例,如果我有一个没有子对象的 DOM 对象并且我 var_dump() 它,我希望它只是转储对象而不开始遍历 DOM 树并转储父母、祖父母和其他儿童等。

【问题讨论】:

标签: php var-dump


【解决方案1】:

在您的开发环境中安装 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的方法?
  • @NicholasShanks no 除非您自己编写并跟踪深度,否则不会。
【解决方案2】:

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

来自PHP docs

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

【讨论】:

  • 真的吗?当我尝试将 stdClass 发送到 foreach 时,PHP 总是给我一个通知。您可以使用的对象是否有限制?
  • @animuson 你能贴一个例子吗?我从来没有遇到过这样的问题。
  • @yoda:这只是标准的“foreach 预期参数 1 为数组”或其他任何内容。我总是必须先将 stdClass 类型转换为数组,然后将其发送到 foreach 以消除通知。
  • 好吧,既然我知道了,我会尝试在我的代码中找到我的问题所在并发布一个问题,为什么它会这样做......
【解决方案3】:

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-05-06
    • 2018-03-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-03-25
    相关资源
    最近更新 更多