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

<?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();
?>

因此,Foo扩展了Bar。 $ myfoo是Foo类的一个对象。 Foo没有称为test()的方法,因此它从其父Bar扩展了它。但是为什么test()的结果是
Bar::testPrivate
Foo::testPublic

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

提前非常感谢您!

最佳答案

顾名思义,可能是因为testPrivate是一个私有(private)方法,不会被类继承所继承/覆盖。

在php.net手册页上,您可能从中获得了该代码,明确指出了We can redeclare the public and protected method, but not private
因此,实际发生的情况如下:子类将不会重新声明方法testPrivate,而是仅在子对象的情况下才在“作用域”中创建其自己的版本。由于在父类中定义了test(),它将访问父类testPrivate

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

关于php - 继承和可见性-PHP,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/13044281/

10-09 18:30