11

カスタムクラスの var_dump 出力をオーバーライドすることは可能ですか? 私はこのようなものが欲しい:

class MyClass{
    public $foo;
    public $bar;
    //pseudo-code
    public function __dump($foo, $bar)
    {
        return 'Foo:$foo, bar:$bar';
    }
}

var_dump(array($instanceOfMyClass));
//it should output this:
array(1) {
  [0] =>
  class MyClass#1 (2) {
    Foo:valueOfFoo, bar:valueOfBar
  }
}

サードパーティの var_dump の代替手段を使用できることはわかっていますが、ライブラリ プロジェクトで var_dump の動作をカスタマイズしたいと考えています。

ありがとう。

4

5 に答える 5

15

PHP 5.6.0+では、__debugInfo()マジック関数を使用して の出力をカスタマイズできますvar_dump()

array __debugInfo ( void )

このメソッドは、var_dump()表示されるプロパティを取得するためにオブジェクトをダンプするときに呼び出されます。メソッドがオブジェクトで定義されていない場合、すべての公開、保護、および非公開のプロパティが表示されます。

この機能は PHP 5.6.0 で追加されました。

例:

class MyDateTime{
    public $year, $month, $day, $hour, $minute, $second;
    public function __debugInfo() {
        return array(
            'date' => $this->year . "-" . $this->month . "-" . $this->day,
            'time' => sprintf("%02d:%02d:%02d", $this->hour, $this->minute, $this->second),
        );
    }
}

$dt = new MyDateTime();
$dt->year = 2014; $dt->month = 9; $dt->day = 20;
$dt->hour = 16; $dt->minute = 2; $dt->second = 41;
var_dump($dt);

PHP 5.6.0 による出力:

object(MyDateTime)#1 (2) {
  ["date"]=>
  string(9) "2014-9-20"
  ["time"]=>
  string(8) "16:02:41"
}

PHP 5.0.0 - 5.5.16 による出力:

object(MyDateTime)#1 (6) {
  ["year"]=>
  int(2014)
  ["month"]=>
  int(9)
  ["day"]=>
  int(20)
  ["hour"]=>
  int(16)
  ["minute"]=>
  int(2)
  ["second"]=>
  int(41)
}

ノート:

  1. __debugInfo()を返す必要がありarrayます。PHP 5.6.0 でstring次のエラーが発生しました。

    致命的なエラー: __debuginfo() は /somepath/somefile.php の 15 行目に配列を返す必要があります

  2. これはprint_r()どこにも文書化されていないようですが、それも動作するようです。

于 2014-09-20T04:01:10.847 に答える