用户发布了对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”。
所以我的问题是:
答案 0 :(得分:3)
由于在子课程中您没有定义任何function inherited()
,因此必须调用其父级方法。正如你引用的评论所说:
...私有方法仅对定义它们的类可见,并且子类不会看到父级的私有方法。 ...
那就是说,因为你没有任何公共方法来引用孩子的私人方法,例如:
class child extends base {
public function inherited() {
$this->overriden();
}
// ...
从我的角度来看,调用$test->inherited()
将使用其父级的范围,因此,如果您创建父类的实例并调用$this->inherited()
会发生什么。它输出 base 。
尝试按照上面的说法进行操作:在子类中,复制并粘贴父级的继承方法。它将输出 child 。
我不确定这是否得到了很好的解释,如果是的话,也许它可以帮助你理解更多,如果不是,有人可以帮助我改进它。