子类访问父类的私有方法?

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-&gt;inherited() 将使用其父类的范围,因此,如果您创建父类的实例并调用$this-&gt;inherited(),会发生什么情况。它会输出 base

尝试做我上面说的:在子类中,复制并粘贴父类继承的方法。它将输出 child

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

【讨论】:

简单总结:如果它会输出child,那意味着父级的inherited的实现会调用子级的overridden的实现,这显然违反了“只对类可见”定义他们”的规则。 是的,如果你想让$test-&gt;inherited()输出child你只需要在子类中创建inherited()函数。感谢@deceze 的评论 啊哈,这是关于我(也许我并不孤单)如何理解继承:实际上是一种方法和属性的复制。所以我想当子类继承inherited 方法时,它实际上得到了它的副本。从这个角度来看,孩子调用 ITS OWN inherited 方法,然后调用孩子的 overridden 方法并输出“child”。好吧,我意识到这不是它的实际工作方式。 :-) 我猜它继承了“引用”,所以你可以直接从孩子那里调用它,除非你在孩子中覆盖它。

以上是关于子类访问父类的私有方法?的主要内容,如果未能解决你的问题,请参考以下文章

通过反射访问父类的私有成员

从子类访问父类的私有实例变量?

Java中子类继承了父类的私有属性及方法吗?

JAVA中子类能不能继承父类的私有属性和方法?

子类可以继承父类的一切方法,成员变量,甚至是私有的,但是却不能够访问这些私有的成员变量和方法

子类如何访问父类