我有一个非常奇怪的问题,当我尝试 var_dump (或 print_r )一个Doctrine对象时,我的Apache响应空白页(200 OK标题) 。我可以 var_dump 一个普通的php var,如:

$dummy = array("a" => 1, "b" =>2);

它工作正常。但我不能使用任何Doctrine类中的任何对象(例如 $ connection-> query()的结果,或者来自我的Doctrine对象模型的类的实例)。

有人知道为什么会这样吗?

有帮助吗?

解决方案

我有时在尝试 print_r()一个自引用对象时 - 它进入循环并耗尽内存。可能这就是发生在你身上的事情。

尝试增加内存限制( ini_set('memory_limit','256M'); )并查看是否修复了它。

编辑:我认为没有一个实际的解决方案 - 它的PHP的内部 var_dump / print_r 不限制递归的深度(或不做得恰到好处,至少)。如果您安装了 XDebug 扩展程序,则可以使用版本替换内置的 var_dump 能够更好地处理递归。

其他提示

延迟加载代理总是包含Doctrine的EntityManager及其所有依赖项的实例。

因此, var_dump 可能会转储一个非常大的递归结构,这种结构无法呈现和读取。您必须使用 \ Doctrine \ Common \ Util \ Debug :: dump()将转储限制为人类可读的级别。请注意,此函数的默认深度设置为2(它是第二个参数)

使用 Doctrine_Record 类的 toArray 方法

var_dump($doctrine_record->toArray());

只会显示数据库字段并避免转储完整的Doctrine内部(包含自引用/递归顺便说一句)

如果您确定该对象是Doctrine_Collection的实例,则可以使用toArray。 Xdebug对学说记录没有帮助。

我建议的方法是实现一个自定义递归函数来打印对象,当需要时使用Doctrine_Record :: toArray()

function var_dump_improved()
{
   foreach (func_get_args() as $arg) {
       if ($args instanceof Doctrine_Collection) {
          print_r($arg);
       } else if ( $arg instanceof Traversable || is_array($arg) ) {
          // do a foreach and recall var_dump_improved on subelements
       } else if (...) {
          // other types
       } 
   }   
}

使用最大嵌套级别调试的一些递归函数在这里

http://php.net/manual/en/function.var- dump.php

查看评论,寻找“递归”

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top