8

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

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

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

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

4

4 回答 4

51

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

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

于 2011-12-27T15:02:01.260 回答
9

使用类的toArray方法Doctrine_Record

var_dump($doctrine_record->toArray());

将只显示数据库字段并避免转储完整的 Doctrine 内部(包含自引用/递归 btw)

于 2010-09-26T18:11:01.077 回答
1

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

尝试增加内存限制 ( ini_set('memory_limit', '256M');) 并查看是否可以解决问题。

编辑:我不认为有一个实际的解决方法 - 它是 PHP 的内部var_dump/print_r不限制递归深度(或者至少没有正确地执行它)。如果您安装XDebug扩展,这可以将内置var_dump版本替换为更好地处理递归的版本。

于 2008-10-19T13:29:22.090 回答
0

如果您确定对象是 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

看评论,找“递归”

于 2012-01-10T01:35:48.993 回答