此问题在此处已有答案:
Strange behavior when overriding private methods(3个答案)
Is it possible to overwrite a function in PHP(10个答案)
Is a private parent method "overridden" if child has an implementation of it?(1个答案)
Why can child override and access its parent private method?(1个答案)
2天前关闭。
这个例子的结果是“A类!“,而不是“B类!“,为什么?
class A {
private function foo() {
echo "Class A ! \n";
}
public function test() {
var_dump($this);
$this->foo();
}
}
class B extends A {
public function foo() {
echo "Class B ! \n";
}
}
$b = new B();
$b->test();
// Outputs:
// object(B)#1 (0) {}
// Class A !
字符串
我还以为成绩是“B级!“
3条答案
按热度按时间ryevplcw1#
原因是因为类
AA
中的test()
函数调用了$this->foo()
,这意味着它是类中的函数(AA
)AA->foo()
本身是一个私有函数。另外$this
是PHP中引用当前对象的特殊变量。当类继承时,请参阅类BB
和CC
的foo()
访问修饰符是public
,但是AA->foo()
是private
。为了覆盖一个函数,你需要有相同的访问修饰符。由于访问修饰符是不一样的,即使名称相似,AA->foo()
也不能被覆盖。nuypyhwy2#
因为
foo()
在类A中是private
,所以在类A之外不可见。因此类B中的foo()
被视为不同的函数。B中的foo()
不会覆盖A中的foo()
。由于test()
是A的一部分,它使用A中同名的函数。字符串
如果你把这两个函数都公开,你会得到你所期望的行为- demo:https://3v4l.org/8kOCl。
0md85ypi3#
不能在子类中修改私有类
把代码改成这样就可以了:
字符串