Php 我的类的自定义var_转储输出

Php 我的类的自定义var_转储输出,php,var-dump,Php,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 thi

是否可以覆盖自定义类的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_转储替代方案,但我想在我的库项目中自定义var_转储的行为


谢谢。

为此,您可以使用ReflectionClass函数并构建自己的函数来获取所需的信息



您不能覆盖核心PHP函数

您可以在对象中添加函数u_toString():

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

$myClass = new myClass();

echo $myClass;

重写var_dump result没有意义,您可以使用toString()魔术方法

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;
class-MyClass{
公帑$foo;
公共酒吧;
公共函数测试(){}
公共函数
{
$vars=“变量:”;
foreach(获取类变量(uuu类变量)作为$name=>$value)$vars.=“
$name:{$this->{$name}”。gettype($this->{$name}); 返回{u CLASS}:
'.$vars.
方法:
'.内爆({br>'),获取{u CLASS}方法({u CLASS})); } } $lol=新的MyClass(); $lol->foo=10; $lol->bar='asd'; echo$lol;

示例

PHP5.6.0+中,您可以使用magic函数自定义的输出

array\uu调试信息(void)

当转储对象以获取应显示的属性时,调用此方法。如果未在对象上定义该方法,则将显示所有公共、受保护和私有属性

此功能是在PHP5.6.0中添加的

例子: PHP 5.6.0的输出: PHP 5.0.0-5.5.16的输出: 笔记:
  • 必须返回一个
    数组
    。我在PHP5.6.0中返回
    字符串时出错:

    致命错误:_debuginfo()必须在第15行的/somepath/somefile.php中返回一个数组
  • 它似乎也可以使用,尽管这似乎在任何地方都没有记录

  • 谢谢,但我知道如何使用toString。在转储一般PHP类的复杂结构时,我想简化var_转储输出,并且我的一些类可以以更简单的方式转储,谢谢,但这不会影响var_转储的输出。var_dump输出是硬连线的,还是可以为特定类定制?您不能重写php函数。您可以构建自己的var_dump函数并获取所需的所有信息。问题是特定类的var_dump行为是否可以被覆盖,即通过magic方法覆盖。知道如何使用toString。关键是,我有复杂的对象结构(PHP数组和其他类),结构的一部分是可以简化的类对象。我想用var_dump转储整个结构,并自定义我的类的部分输出。您不能对输出进行成本化,因为var_dump是一个具有直接输出的php函数,您最多可以用ob_函数过滤输出,并用一些正则表达式编辑输出,但不推荐这样做
    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);
    
    object(MyDateTime)#1 (2) {
      ["date"]=>
      string(9) "2014-9-20"
      ["time"]=>
      string(8) "16:02:41"
    }
    
    object(MyDateTime)#1 (6) {
      ["year"]=>
      int(2014)
      ["month"]=>
      int(9)
      ["day"]=>
      int(20)
      ["hour"]=>
      int(16)
      ["minute"]=>
      int(2)
      ["second"]=>
      int(41)
    }