子类为何无法重写父类的__debugInfo方法?
问题原因及解决方法
核心原因
__debugInfo() 魔术方法仅被 var_dump() 识别并使用,print_r() 不会读取这个方法返回的内容,它会直接输出对象的所有内部属性,包括从Carbon继承来的受保护属性。
验证与解决
- 替换为
var_dump()即可得到期望输出:
use Carbon\Carbon; class Demo extends Carbon { public function __debugInfo(): array { return ['value' => $this->__toString()]; } } $d = new Demo(); var_dump($d);
输出结果:
object(Demo)#1 (1) { ["value"]=> string(19) "2023-05-23 13:57:18" }
- 若要让
print_r()输出自定义内容,可重写__toString()方法后直接输出对象:
use Carbon\Carbon; class Demo extends Carbon { public function __debugInfo(): array { return ['value' => $this->__toString()]; } public function __toString(): string { return "Demo Object\n(\n [value] => {$this->toDateTimeString()}\n)"; } } $d = new Demo(); echo $d;
输出结果与你期望的完全一致。
内容的提问来源于stack exchange,提问作者neubert
相关产品推荐
相关产品推荐

