为何类方法中调用var_dump(debug_backtrace())会触发对象的__debugInfo()?
为什么调用
methodA()会触发__debugInfo()? 咱们直接点出核心原因:methodA()里的debug_backtrace()会把当前的B实例(也就是$this)包含在回溯结果中,而var_dump()在处理这个对象时,会自动触发它的__debugInfo()魔术方法。
接下来咱们一步步拆解整个执行流程,你就能完全明白:
- 当你执行
$b = new B(); $b->methodA();时,因为B继承了A,所以会调用A类中的methodA方法。 - 在
methodA内部,debug_backtrace()会生成一个记录当前调用栈所有上下文信息的数组——这个数组里的某个栈帧条目会包含当前的调用对象$b(也就是B类的实例),毕竟这个方法是通过$b触发的,回溯需要保留这个调用上下文。 - 随后
var_dump()开始输出这个回溯数组,当它遍历到数组里的B对象时,PHP的内置调试机制会自动检查这个对象所属的类是否定义了__debugInfo()方法。如果有,就会调用这个方法来获取要显示的内容,而不是直接输出对象的默认属性。 - 这时候就会触发
B类的__debugInfo():- 首先输出
__debugInfo!!!; - 接着创建一个
A类的实例$a,然后调用var_dump($a)——这时候又会触发A类的__debugInfo(),因为它返回了空数组,所以var_dump($a)只会显示object(A)#2 (0) {}。
- 首先输出
额外补充一下:__debugInfo()是PHP 5.6及以上版本引入的魔术方法,专门用于自定义对象在调试输出(比如var_dump、print_r)时的表现。如果没有定义这个方法,var_dump()会默认输出对象的所有可见属性;一旦定义,就会完全用这个方法返回的数组来生成调试输出内容。
内容的提问来源于stack exchange,提问作者tonix
相关产品推荐
相关产品推荐

