1

有人可以解释一下为什么在以下情况下:

class A {

    public function methodA() {
        var_dump(debug_backtrace());
    }

    public function __debugInfo() {
        return [];
    }

    public function __clone() {
        echo "clone A!!!";
    }

}

class B extends A {

    public function __clone() {
        echo "clone B!!!";
        $a = new A();
        clone $a;
    }

    public function __debugInfo() {
        echo __FUNCTION__ . '!!!';
        $a = new A();
        var_dump($a);
    }

}

当我创建一个类型的对象B并调用时methodA()

$b = new B();
$b->methodA();

__debugInfo()也被执行:

array(1) {
  [0]=>
  array(7) {
    ["file"]=>
    string(14) "php shell code"
    ["line"]=>
    int(1)
    ["function"]=>
    string(7) "methodA"
    ["class"]=>
    string(1) "A"
    ["object"]=>
    __debugInfo!!!object(A)#2 (0) {
}
object(B)#1 (0) {
    }
    ["type"]=>
    string(2) "->"
    ["args"]=>
    array(0) {
    }
  }
}

我没有转储对象,我转储了调试回溯......

我在文档中遗漏了什么吗?http://php.net/manual/en/language.oop5.magic.php#object.debuginfo

谢谢!

4

1 回答 1

3

这是因为debug_backtrace()有选项:

DEBUG_BACKTRACE_PROVIDE_OBJECT : true

这将在内部转储带有跟踪的对象。

此外,在转储对象以获取应显示的属性时, var_dump()会调用__debugInfo()方法。

__debugInfo()是 PHP 魔术方法之一。除非您想要与它们关联的魔术功能,否则您不能在任何类中使用具有这些名称的函数。

因此,为避免调用__debugInfo(),请尝试:

public function methodA() {
    var_dump(debug_backtrace(0));
}
于 2018-04-11T07:48:56.177 回答