Почему var_dump (debug_backtrace ()) в методе вызывает объект __debugInfo ()?

Может ли кто-нибудь объяснить мне, почему в следующем случае:

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

Спасибо!

1

Решение

Это потому что, debug_backtrace () имеет опцию:

DEBUG_BACKTRACE_PROVIDE_OBJECT : true

который внутренне сбросит объект с трассировкой.

Более того, __debugInfo () метод вызывается var_dump () при сбросе объекта, чтобы получить свойства, которые должны быть показаны.

__debugInfo () является одним из магических методов PHP. Вы не можете иметь функции с этими именами ни в одном из ваших классов, если не хотите, чтобы магическая функциональность ассоциировалась с ними.

Итак, чтобы не звонить __debugInfo (), пытаться :

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

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]