子类访问父的私有方法?

时间:2017-02-24 14:24:32

标签: php inheritance methods visibility

用户发布了对PHP Visibility manual page的评论。这是第二多被投票的评论。他使用了这个代码示例:

<?php
abstract class base {
    public function inherited() {
        $this->overridden();
    }
    private function overridden() {
        echo 'base';
    }
}

class child extends base {
    private function overridden() {
        echo 'child';
    }
}

$test = new child();
$test->inherited();
?>

输出将是“基础”。

据我所知:“child”类继承了 inherited()方法。不继承重写()方法,因为它是私有的,但是定义了自己的方法。但是当测试对象(子类的实例)运行inherited()方法时,它会输出“base”。

所以我的问题是:

  1. 孩子如何运行一个无法访问的方法?
  2. 为什么它没有运行自己重新定义的方法?

1 个答案:

答案 0 :(得分:3)

由于在子课程中您没有定义任何function inherited(),因此必须调用其父级方法。正如你引用的评论所说:

  

...私有方法仅对定义它们的类可见,并且子类不会看到父级的私有方法。 ...

那就是说,因为你没有任何公共方法来引用孩子的私人方法,例如:

class child extends base {
    public function inherited() {
        $this->overriden();
    }

    // ...

从我的角度来看,调用$test->inherited()将使用其父级的范围,因此,如果您创建父类的实例并调用$this->inherited()会发生什么。它输出 base

尝试按照上面的说法进行操作:在子类中,复制并粘贴父级的继承方法。它将输出 child

我不确定这是否得到了很好的解释,如果是的话,也许它可以帮助你理解更多,如果不是,有人可以帮助我改进它。