如何使xdebug的var_dump显示完整的对象/数组

349

我正在使用xdebug (php_xdebug-2.1.2-5.3-vc9.dll) 在WAMP上。当我在一个大的对象或变量上使用var_dump时,它并没有显示出完整的变量。

array
'node' => 
  array
    'my_form' => 
      array
        'form' => 
          array
            ...

没有使用xdebug时,它的显示效果是正常的。我查看了文档但没有找到解决方法。请问有人知道如何修复这个问题,以便xdebug的var_dump可以显示完整的对象吗?


print_r将打印包含所有嵌套值的完整数组。 - Rashmi Jain
7个回答

689

这些是php.ini中的可配置变量:

; with sane limits
xdebug.var_display_max_depth = 10
xdebug.var_display_max_children = 256
xdebug.var_display_max_data = 1024 


; with no limits
; (maximum nesting is 1023)
xdebug.var_display_max_depth = -1 
xdebug.var_display_max_children = -1
xdebug.var_display_max_data = -1 

当然,这些也可以通过ini_set()在运行时设置,如果您不想修改php.ini并重新启动Web服务器,但需要快速深入检查某些内容,则非常有用。

ini_set('xdebug.var_display_max_depth', 10);
ini_set('xdebug.var_display_max_children', 256);
ini_set('xdebug.var_display_max_data', 1024);

官方文档中解释了Xdebug的设置


如果有人无法正确获取他们的php.ini的编辑或找不到ini文件,则替代方法是在运行时更改设置,这里显示https://dev59.com/72sz5IYBdhLWcg3wsaAN#8331138。 - Relequestual
这些值也可以在 .htaccess 文件中设置: php_value xdebug.var_display_max_depth 5 php_value xdebug.var_display_max_children 256 php_value xdebug.var_display_max_data 1024 - Werner
3
在过去的六个月中,我已经访问了这个答案超过十次。感谢Michael Berkowski,我将永远感激你。 - Lincoln Bergeson
3
@LincolnBergeson 我自己也经常需要查找这个信息。 - Michael Berkowski
1
我已经在php.ini和.htaccess中添加了这些设置,重新启动了服务器(在本地主机上),但是Visual Studio Code仍然无法显示所有数组值。我错过了什么吗? - Adivate
显示剩余2条评论

45

我知道这是一个非常老的帖子,但我想这可能仍然有所帮助。

如果你熟悉阅读json格式,你可以用以下代码替换你的var_dump:

return json_encode($myvar);

我一直在使用这个方法来帮助排查一个我正在构建的服务,该服务包含一些深度嵌套的数组。这个方法可以返回您数组的每个级别,而不会截断任何内容或要求您更改php.ini文件。

此外,由于json_encoded数据是一个字符串,这意味着你可以轻松地将它写入错误日志中。

error_log(json_encode($myvar));

它可能并不是每种情况下的最佳选择,但它是一个选择!


12
我喜欢这个答案。您可以使用以下代码获得漂亮的HTML输出:return '<pre>'.json_encode($myvar, JSON_PRETTY_PRINT).'</pre>';请注意,翻译后的内容与原文意思相同,只是更加通俗易懂。 - David
8
请记住,不是所有变量都可以进行json编码。没有实现jsonserializable接口的对象将只返回一个空数组“{}”。 - Kristian Sandström
2
值得注意的是,对某个东西进行json编码不会显示其类型,因此更难以确定是否匹配适当。 - SEoF
1
这是一个有趣的答案。原创! - Sergio Codev

16

我知道现在可能有些晚了,但这可能会有一些用处:

echo "<pre>";
print_r($array);
echo "</pre>";

30
print_r() 不是 var_dump 的替代品。 - AnrDaemon
绝妙的答案。谢谢。 - Handsome Nerd
@AnrDaemon 真的吗? - Handsome Nerd
1
var_dump([false]); print_r([false]);变量转储([false]); 打印_r([false]); - AnrDaemon
我知道这有点晚了,但是根据你的需求,print_r()绝对可以替代var_dump()!我几乎不再使用var_dump(),因为我经常想显示数组结构,而在我看来,print_r()比var_dump()更好地展示了它。 - bestprogrammerintheworld
显示剩余2条评论

15

或者您可以使用另一种选择:

https://github.com/php-sage/sage

它不需要任何设置,比Xdebug的var_dump功能更强大。要使用Sage在运行时绕过嵌套限制,只需使用:

 +d( $variable ); // append `+` to the dump call

是的,很好,但仅为转储调试数据使用外部库有点过度设计,你同意吗? - clockw0rk
这不是你经常做的工作的66%吗 - 调试数据..? 另外,当你说“过度”时,你是担心外部库占用了开发机器的磁盘空间,还是担心其他什么呢 :) - raveren

6

请查看Xdebug的var_dump设置,特别是这些设置的值:

xdebug.var_display_max_children
xdebug.var_display_max_data
xdebug.var_display_max_depth

5

我想推荐var_export($array) - 它不显示类型,但生成的语法可以在你的代码中使用 :)


1
有时候文件中的var_export非常有用。
file_put_contents(__DIR__.'/temp.txt', var_export($var, true), FILE_APPEND);

例如,如果您正在生产服务器上调试某些内容。

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