1

请查看下面给出的代码。

<?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(); // Bar::testPrivate 
                // Foo::testPublic
?> 

在上面的例子中,当我们调用$myFoo->test();它时,它被称为类testPrivate,但是它是Bar class 如何被称为类的。testPublicFoo

任何人都可以帮助我吗?

4

3 回答 3

0

因为 test() 不在 Foo 中,而是在 Bar 范围内运行。Bar 范围无法访问 Foo 私有方法。只需将 test() 添加到 Foo ...

于 2012-06-17T09:58:36.870 回答
0

Bar.testPrivate并且Foo.testPrivate必须是受保护的方法而不是私有方法。请参阅此处了解更多信息:

http://php.net/manual/en/language.oop5.visibility.php

于 2012-06-13T18:24:17.257 回答
0

事实上,可见性页面上的评论之一确实重申了这一点:

“私有方法从不参与覆盖,因为这些方法在子类中不可见。”

确实感觉有点奇怪,因为您会认为子类会以相同的方法名称覆盖父类,但私有方法并非如此,并且父类方法在这里优先,因此如果您最好使用受保护的方法想要覆盖。

于 2012-06-17T11:27:52.443 回答