PHP继承中私有方法可见性:重写private方法未生效原因问询
PHP私有方法调用规则说明
问题代码与运行结果
class A { private function foo() { echo "A class success!\n"; } public function test() { echo get_class($this) . PHP_EOL; var_dump($this) . PHP_EOL; $this->foo(); } } class C extends A { private function foo() { echo "C class success!"; } } $c = new C(); $c->test();
运行输出:
C object(C)#1 (0) { } A class success!
原因解释
private类型方法不支持重写
PHP的方法重写机制仅对public和protected修饰的方法生效。private方法的可见范围仅限定在定义它的类本身,子类无法感知、也无法访问父类的private方法。你在C类中定义的foo()是属于C类的全新独立方法,和A类的foo()没有任何继承覆盖关系。- 私有方法采用编译期静态绑定
对于private方法,PHP会在代码编译阶段就确定调用的方法归属,不会在运行时根据$this的实际类型做动态绑定。test()方法是定义在A类内部的,编译阶段就会将$this->foo()的调用绑定到A类自己的私有foo()方法,所以哪怕$this是C类的实例,最终调用的还是A类的方法。
实现方法重写的方案
如果需要让子类可以重写foo()逻辑,只需要将A类中foo()的修饰符从private改为protected或者public即可,修改后运行代码就会触发动态绑定,执行C类的foo()方法。
内容的提问来源于stack exchange,提问作者vladimirB
相关产品推荐
相关产品推荐

