什么会导致print_r和/或var_dump调试变量失败?

时间:2014-02-05 21:26:16

标签: php debugging magento

我正在尝试调试Magento中的PayPal审核流程。每当我尝试转储以下变量时,我都会得到一个白页:

//the variable declaration:
$shippingAddress = $this->getShippingAddress();

//the dump that breaks the page:
 <?php echo '<pre>';print_r($shippingAddress);echo '</pre>'; ?>

我还尝试在页面上使用一个变量而不是if语句。

//this variable displays results
<?php echo '<pre>';print_r($billingBlock->setShowAsShippingCheckbox(true)->toHtml());echo '</pre>'; ?>

//however, this one does not:
<?php echo '<pre>';print_r($billingBlock);echo '</pre>'; ?>

我只是想知道什么可能导致我的var_dump破坏页面?如果我不能转储它,我如何看到对象中的内容?

2 个答案:

答案 0 :(得分:11)

首先,PHP从不“只是白页”。当你得到一个空白屏幕时,这意味着PHP的执行因某种原因而停止。但是,除非您的服务器已配置为不记录错误,否则PHP错误日志或Magento异常日志应该有错误。

就您的具体问题而言,许多Magento的对象都包含对大量信息的引用 - 有时引用是循环的。 PHP的var_dumpprint_r函数将盲目地遵循这些循环引用并尝试打印出所有内容。这最终会导致PHP使用的内存超过memory_limit ini设置所允许的内存,并且执行暂停。

大多数PHP专业人员使用xDebug扩展来解决此问题。 xDebug扩展名具有修改后的var_dump,它将限制转储的信息量,从而防止出现上述内存限制问题。如果xDebug仍无法解决内存限制问题,则xdebug.var_display_max_childrenxdebug.var_display_max_dataxdebug.var_display_max_depth ini设置是您要调整的设置。 (一些PHP发行版最初设置得太高了)

如果这不可能,那么var_dump的一点点谨慎仍然有帮助。

用它来计算变量类型

var_dump(get_class($thing));

如果它是Magento对象,请使用此对象查看其数据键

var_dump(array_keys($thing->getData()));

然后使用

输出单个数据成员
var_dump($thing->getData('key_name'));
var_dump($thing->getKeyName()));

答案 1 :(得分:0)

PHP解析和致命错误会产生这种情况。您可能需要查看错误日志。

您可以尝试将以下行添加到php文件的开头(在打开PHP标记之后)

ini_set('display_errors',1);
error_reporting(E_ALL);