php5 ---方法可见性问题

时间:2012-06-13 18:09:29

标签: php-5.3

请看下面给出的代码。

<?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 但它怎么称为testPublic类的Foo

任何人都可以帮助我吗?

3 个答案:

答案 0 :(得分:0)

Bar.testPrivateFoo.testPrivate必须是受保护的方法,而不是私有方法。请点击此处了解更多信息:

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

答案 1 :(得分:0)

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

答案 2 :(得分:0)

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

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

它确实感觉有点奇怪,因为你会认为子类会覆盖方法名称相同的父类,但不是私有方法的情况,而parent方法在这里需要预先考虑,所以最好使用protected方法,如果你想覆盖。