继承和可见性 - PHP

Fae*_*ery 20 php inheritance

我很难理解为什么我们得到这段代码的输出:

<?php

class Bar 
{
    public function test() {
        $this->testPrivate();
        $this->testPublic();
    }

    public function testPublic() {
        echo "Bar::testPublic\n";
    }

    private function testPrivate() {
        echo "Bar::testPrivate\n";
    }
}

class Foo extends Bar 
{
    public function testPublic() {
        echo "Foo::testPublic\n";
    }

    private function testPrivate() {
        echo "Foo::testPrivate\n";
    }
}

$myFoo = new foo();
$myFoo->test(); 
?>
Run Code Online (Sandbox Code Playgroud)

所以Foo扩展了Bar.$ myfoo是Foo类的一个对象.Foo没有一个叫做test()的方法,所以它从它的父Bar扩展它.但是为什么test()的结果是

Bar::testPrivate 
Foo::testPublic
Run Code Online (Sandbox Code Playgroud)

你能解释一下为什么第一个不是Foo :: testPrivate,当这个父方法在孩子中被覆盖时?

非常感谢你提前!

Lou*_*uer 12

也许监守testPrivate,随着名字已经表明,一个私有方法,并不会被继承/由类继承覆盖.

在php.net手册页上,您可能会从中明确地说明了该代码 We can redeclare the public and protected method, but not private

因此,具体如下:子类不会重新声明该方法testPrivate,而是仅在子对象的情况下在"范围"中创建自己的版本.正如test()在父类中定义的那样,它将访问父类testPrivate.

如果要重新声明test子类中的函数,它应该访问childs ? testPrivate()方法.


Pat*_*and 6

除了声明类之外,任何其他方法都不会看到私有方法.由于您testPrivate从父类调用,它可以访问的唯一方法是它自己的方法声明.这样你就得到了你看到的输出.protected但是,如果有访问修饰符,那么您将获得预期的输出,因为受保护的方法在整个继承链中都是可见的.


lau*_*ent 5

private成员不能被覆盖,只有公共和受保护的人才可以.这意味着,实际上testPrivate重写,所以Bar不能看到它,还叫自己的testPrivate.


F.P*_*F.P 5

因为private手段private.没有其他课程,甚至没有孩子班级知道Bar::testPrivate(),因此不能覆盖他们甚至不知道的事情.

Foo::testPrivate()只能在里面使用Foo.因为这private就是全部.

更多信息:覆盖私有方法时的奇怪行为