我遇到了以下结构:
// parent class
class A
{
public function myFunc1()
{
$this->myFunc2();
}
private function myFunc2()
{
echo "called from class A";
}
}
// sub-class
class B extends A
{
private function myFunc2()
{
echo "called from class B";
}
}
$foo = new B();
$foo->myFunc1();
我预计,因为B类中没有 myFunc1(),所以调用了父函数。这似乎是正确的。
现在,为了安全起见,我在 myFunc1()中var_dump
$ this ,并显示这是B类型的对象。< / p>
根据我的理解,它应该从B类调用 myFunc2(),但这不会发生。它从A类调用方法。
从A级打来
而不是
从B级打来
是的,功能是私有,如果我将其更改为受保护,则按预期工作。但私有意味着,我可以访问这个函数,当我在特定的上下文中时,不是吗?
答案 0 :(得分:2)
在其定义的类中,私有函数仅可用,而不是在子类中。
这意味着您的Object有两个完全不同的函数,它们碰巧具有相同的名称。对象B知道有其中一个,而对象A只知道有另一个。它们不会以任何方式相互作用。
由于这些函数对于它们所定义的特定类是完全私有的,因此无法覆盖它们,或者任何其他类都无法调用它们。
如果您需要允许覆盖类的工作方式的行为,则必须使用 protected ,它专门设计为可调用且可从扩展中更改(因此是完全不同的野兽在一起)。
答案 1 :(得分:0)
private
始终属于您无法继承的同一个班级。这就是为myFunc1()
调用myFunc2()
课A
{{}}}的原因。如果要覆盖它,则必须将可见性更改为protected
。