继承和函数调用父类和子类

时间:2016-03-09 15:37:02

标签: php inheritance

我遇到了以下结构:

// 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级打来

是的,功能是私有,如果我将其更改为受保护,则按预期工作。但私有意味着,我可以访问这个函数,当我在特定的上下文中时,不是吗?

2 个答案:

答案 0 :(得分:2)

在其定义的类中,私有函数可用,而不是在子类中。

这意味着您的Object有两个完全不同的函数,它们碰巧具有相同的名称。对象B知道有其中一个,而对象A只知道有另一个。它们不会以任何方式相互作用。

由于这些函数对于它们所定义的特定类是完全私有的,因此无法覆盖它们,或者任何其他类都无法调用它们。

如果您需要允许覆盖类的工作方式的行为,则必须使用 protected ,它专门设计为可调用且可从扩展中更改(因此是完全不同的野兽在一起)。

答案 1 :(得分:0)

private始终属于您无法继承的同一个班级。这就是为myFunc1()调用myFunc2()A {{}}}的原因。如果要覆盖它,则必须将可见性更改为protected