PHP中是否有一种直接的方法可以将任意复杂值转换为字符串而不触发递归限制?例如,传递一个非常嵌套的对象并指定我只想要 2 层深。
我要避免的是在 var_export 或 var_dump 上出现错误,即使这意味着我得到的输出不太准确。
谢谢!
澄清:我想使用字符串来记录使用情况,所以调试器不适用。
PHP中是否有一种直接的方法可以将任意复杂值转换为字符串而不触发递归限制?例如,传递一个非常嵌套的对象并指定我只想要 2 层深。
我要避免的是在 var_export 或 var_dump 上出现错误,即使这意味着我得到的输出不太准确。
谢谢!
澄清:我想使用字符串来记录使用情况,所以调试器不适用。
我不知道任何直接的方法 - 只有相反:使用 XDEBUG (http://xdebug.org/) 并使用xdebug.var_display_max_depth
设置。
据我所知,XDEBUG 的 var_dump 比 PHP 更好......
如果您不需要可运行代码,则可以使用print_r()
which 可以处理超过var_export()
也许有一个看起来像这样的超级类:
class Dumpable {
function varDump($max_depth = 2) {
return self::dump((array)$this, $max_depth);
}
public static function dump($arr, $max_depth = 2) {
if( $max_depth > 0 ) {
$new_arr = array();
foreach( $arr as $key => $val ) {
if( $val instanceof Dumpable) {
$new_arr[$key] = $val->varDump($max_depth-1);
}
elseif( is_object($val) ) {
$new_arr[$key] = self::dump((array)$val, $max_depth-1);
}
elseif( is_array($val) ) {
$new_arr[$key] = self::dump($val, $max_depth-1);
}
else {
$new_arr[$key] = $val;
}
}
return $new_arr;
}
elseif(is_object($arr)) {
return 'Object:'.get_class($arr).'...';
}
else {
return 'array...';
}
}
public function __toString() {
return print_r($this->varDump(), true);
}
}
然后,您可以var_dump( $my_dumpable_obj->varDump() );
在想要转储扩展 Dumpable 的对象时调用。如果您的服务器支持 php 5.4,最好在 Trait 中使用此函数。