子类访问父类的私有方法?
Posted
技术标签:
【中文标题】子类访问父类的私有方法?【英文标题】:child class accessing parent's private method? 【发布时间】:2017-07-15 10:16:23 【问题描述】:一位用户在 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();
?>
输出将是“基础”。
据我了解:“子”类继承了 inherited() 方法。不继承 overridden() 方法,因为它是私有的,而是定义了自己的方法。但是当 test 对象(子类的实例)运行 inherit() 方法时,它会输出“base”。
所以我的问题是:
-
孩子怎么会运行一个它无权访问的方法?
为什么它不运行自己重新定义的方法?
【问题讨论】:
【参考方案1】:由于在子类中您没有定义任何function inherited()
,它必须调用其父类的方法。正如您引用的评论所说:
...私有方法仅对定义它们的类可见,子类看不到父类的私有方法。 ...
也就是说,由于您没有任何公共方法来引用孩子的私有方法,例如:
class child extends base
public function inherited()
$this->overriden();
// ...
在我看来,调用$test->inherited()
将使用其父类的范围,因此,如果您创建父类的实例并调用$this->inherited()
,会发生什么情况。它会输出 base。
尝试做我上面说的:在子类中,复制并粘贴父类继承的方法。它将输出 child。
我不确定这是否解释得很好,如果是,也许它可以帮助你理解更多,如果不是,有人可以帮助我改进它。
【讨论】:
简单总结:如果它会输出child
,那意味着父级的inherited
的实现会调用子级的overridden
的实现,这显然违反了“只对类可见”定义他们”的规则。
是的,如果你想让$test->inherited()
输出child
你只需要在子类中创建inherited()
函数。感谢@deceze 的评论
啊哈,这是关于我(也许我并不孤单)如何理解继承:实际上是一种方法和属性的复制。所以我想当子类继承inherited
方法时,它实际上得到了它的副本。从这个角度来看,孩子调用 ITS OWN inherited
方法,然后调用孩子的 overridden
方法并输出“child”。好吧,我意识到这不是它的实际工作方式。 :-)
我猜它继承了“引用”,所以你可以直接从孩子那里调用它,除非你在孩子中覆盖它。以上是关于子类访问父类的私有方法?的主要内容,如果未能解决你的问题,请参考以下文章