Пользовательский выход var_dump для моего класса

Можно ли переопределить вывод 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 в моем проекте библиотеки.

Спасибо.

Ответ 1

В 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)
}

Примечания:

  • __debugInfo() должен вернуть array. Я получил ошибку на PHP 5.6.0 для возврата string:

    Неустранимая ошибка: __debuginfo() должен возвращать массив в /somepath/somefile.php в строке 15

  • Кажется, что работает с print_r(), хотя это нигде не документировано.

Ответ 3

Вы не можете перезаписать основные функции PHP.

Вы можете добавить функцию __toString() в свой объект:

class myClass {
    public function __toString(){
        // custom var_dump() content here then output it
    }
}

$myClass = new myClass();

echo $myClass;

Ответ 4

Не нужно переоценивать результат var_dump, вы можете просто использовать метод toString() magic

class MyClass{
public $foo;
public $bar;
public function test(){}
public function __toString()
 {
    $vars="Variables:";
    foreach(get_class_vars(__CLASS__) as $name => $value) $vars.="<br> $name : {$this->{$name}}".gettype($this->{$name});
    return __CLASS__.':<br>'.$vars.'<br>Methods:<br>'.implode('<br>',get_class_methods(__CLASS__));
 }
}

$lol = new MyClass();
$lol->foo = 10;
$lol->bar = 'asd';

 echo $lol;

Пример ЗДЕСЬ