PHPには、再帰制限をトリガーせずに任意の複素数値を文字列に取り込む簡単な方法がありますか?たとえば、非常にネストされたオブジェクトを渡し、2レベルの深さだけが必要であると指定します。
避けたいのは、var_exportまたはvar_dumpでエラーが発生することです。これは、出力の精度が低下することを意味します。
ありがとう!
明確化:ログの使用に文字列を使用したいので、デバッガーは適用できません。
PHPには、再帰制限をトリガーせずに任意の複素数値を文字列に取り込む簡単な方法がありますか?たとえば、非常にネストされたオブジェクトを渡し、2レベルの深さだけが必要であると指定します。
避けたいのは、var_exportまたはvar_dumpでエラーが発生することです。これは、出力の精度が低下することを意味します。
ありがとう!
明確化:ログの使用に文字列を使用したいので、デバッガーは適用できません。
私はこれの簡単な方法を知りません-反対だけです:XDEBUG(http://xdebug.org/)を使用してxdebug.var_display_max_depth
設定で遊んでください。
私の知る限り、XDEBUGはPHPよりも優れたvar_dumpを実行します...
実行可能なコードが必要ない場合はprint_r()
、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を拡張するオブジェクトをダンプするときに呼び出すことができます。サーバーがphp5.4をサポートしている場合は、代わりにこの関数をトレイトで使用する方がよい場合があります。