1

debug_backtrace を使用して php でスタックトレースを取得すると、呼び出し元のオブジェクトを含めることができます。オブジェクトのパブリック プロパティとプライベート プロパティの両方を表示できることは非常に便利ですが、オブジェクトが大きすぎて使用できません。他のオブジェクトを含む変数があるため、単純に出力することはできません.debug_print_backtraceの出力をファイルに書き込もうとしましたが、何かが壊れて出力が停止する前に23Gに達しました.

私が本当に必要としているのは、この出力を 1 レベルの深さに制限することです。つまり、オブジェクトのすべてのプロパティを出力しますが、それらの 1 つが別のオブジェクトである場合は、必要なものすべてをさらにリストするのではなく、そのクラス名です。

get_object_vars を使用してオブジェクトのパブリック プロパティを取得できることはわかっていますが、プライベート プロパティを取得するにはどうすればよいでしょうか。print_r、var_export、var_dump などは、再帰を止めることができないため、すべて役に立ちません。

4

2 に答える 2

0

オブジェクトを配列にキャストしてから、配列を反復処理できます。ヌルバイトで囲まれたクラス名の接頭辞が付いた、プライベートおよび保護されたプロパティも使用できます。この動作を次のようにテストできます。

テスト:

class Test
{
    private $parent;
    public function __construct($parent) {
        $this->parent = $parent;
    }
}

$test = new Test(new Test(new Test(null)));
var_dump((array)$test);

出力:

array(1) {
  ["�Test�parent"]=>
  object(Test)#2 (1) {
    ["parent":"Test":private]=>
    object(Test)#3 (1) {
      ["parent":"Test":private]=>
      NULL
    }
  }
}

foreach配列ができたので、プレフィックスを取り除き、オブジェクトと他の変数を区別する単純な を実行できます。

foreach((array)$test as $name => $property) {
    if (ord($name[0]) === 0) {
        $name = substr($name, strrpos($name, "\x0")+1);
    }
    echo $name, ":";
    if (is_object($property)) {
        echo "(object)", get_class($property);
    } else {
        echo var_export($property, true);
    }
    echo "\n";
}

きれいな印刷はあなたに任せます。

于 2013-02-08T15:08:27.133 に答える
0

次のように、foreach ループを使用して単純にオブジェクトを反復処理できます。

foreach($object as $property => $value)
   if (is_object($value))
      echo(get_class($value)."<br/>");
   else
      echo($property." => ".$value."<br/>");

ただし、これはプライベート プロパティを表示しないことに注意してください。それを乗り越える方法についてのより広範な説明は、http ://www.php.net/manual/en/language.oop5.iterations.php にあります。

于 2013-02-08T14:41:03.627 に答える