【发布时间】:2013-03-28 07:56:34
【问题描述】:
我在辅助类 Utility::error_log() 中有一个静态方法,用于帮助我们优雅地调试 PHP 中的 HUGE 对象。该方法及其辅助方法 Utility::toArray() 如下:
static function error_log($message, $data=null, $max=2)
{
if(is_array($data) || is_object($data))
$data = print_r(self::toArray($data, $max),true);
if(is_array($message) || is_object($message))
$message = print_r(self::toArray($message, $max),true);
if(!empty($data))
$data = "\n".$data;
if (!strstr($message, PHP_EOL))
$message = str_pad(" ".$message." ", 50,'=',STR_PAD_BOTH);
error_log($message.$data);
}
static function toArray($object, $max = 2, $current = 0)
{
if($current > $max)
return ucfirst(gettype($object)).'( ... )';
$current++;
$return = array();
foreach((array) $object as $key => $data)
if (is_object($data))
$return[$key] = self::toArray($data, $max, $current);
elseif (is_array($data))
$return[$key] = self::toArray($data, $max, $current);
else
$return[$key] = $data;
return $return;
}
现在这可能有点看不出来,但要点是,toArray 将一个巨大的对象(大量递归)缩小了一个数量级,并将所有属性作为数组或字符串返回。使用起来更容易...想法是 print_r($array,true) 然后将数组变成一个字符串,然后我们记录它。
但是,这并没有按预期工作。结果是:
[05-Apr-2013 05:29:00] ==================================== PERSISTING SUITS & SHIRTS ===================================
Array
(
[
然后什么也没有,当我调用 print_r($data) 并打印到浏览器时,我得到:
Array
(
[BRS\PageBundle\Entity\Pageroot_folder_name] => Pages
[id] => 43
[title] => Suits & Shirts
[depth_title] => Suits & Shirts
[description] => ( ... AND SO ON ... )
在你说这是一个error_log()长度限制之前,我先提一下我可以成功$data = var_export($data,true)并将结果发送到error_log()没有问题:
[05-Apr-2013 06:00:08] ==================================== PERSISTING SUITS & SHIRTS ===================================
array (
'' . "\0" . 'BRS\\PageBundle\\Entity\\Page' . "\0" . 'root_folder_name' => 'Pages',
'id' => 43,
'title' => 'Suits & Shirts',
'depth_title' => 'Suits & Shirts',
'description' => ( ... AND SO ON ... )
有什么问题?为什么它适用于var_export($data,true) 和print_r($data,false),但不适用于print_r($data,true)??
【问题讨论】:
标签: php arrays object error-log non-printing-characters