我有一个非常奇怪的问题,当我尝试var_dump
(或print_r
)一个Doctrine对象时,我的Apache响应空白页(200 OK标题)。我可以var_dump
一个普通的php var:
$dummy = array("a" => 1, "b" =>2);
它工作正常。但我不能使用任何Doctrine类中的任何对象(例如来自$connection->query()
的结果,或来自我的具有Doctrine的对象模型中的类的实例)。
有人知道为什么会这样吗?
答案 0 :(得分:51)
延迟加载代理总是包含Doctrine的EntityManager及其所有依赖项的实例。
因此,var_dump
可能会转储一个非常大的递归结构,这种结构无法呈现和读取。您必须使用\Doctrine\Common\Util\Debug::dump()
将转储限制为人类可读的级别。请注意,此函数的默认深度设置为2(它是第二个参数)
答案 1 :(得分:9)
使用toArray
类
Doctrine_Record
方法
var_dump($doctrine_record->toArray());
只会显示数据库字段并避免转储完整的Doctrine内部(包含自引用/递归顺便说一句)
答案 2 :(得分:1)
我有时尝试print_r()
一个自引用对象 - 它进入一个循环并耗尽内存。可能这就是发生在你身上的事情。
尝试增加内存限制(ini_set('memory_limit', '256M');
)并查看是否修复了它。
编辑:我认为没有一个实际的解决方法 - 这是PHP的内部var_dump
/ print_r
不限制递归的深度(或者至少不正确,至少)。如果您安装XDebug扩展名,则可以将内置var_dump
替换为更好地处理递归的版本。
答案 3 :(得分: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
查看评论,寻找“递归”