私有方法覆盖和可见性

时间:2014-02-09 01:27:14

标签: php oop visibility override

我很难尝试理解以下代码的输出:

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

    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::testPublic
Bar::testPrivate 

Class Foo 会覆盖 testPublic() testPrivate(),并继承 test()。当我调用 test()时,有一个显式指令包含 $ this 伪变量,所以在我创建 $ myFoo 实例后,最终调用 test()函数将是 $ myFoo-> testPublic() $ myFoo-> testPrivate()。第一个输出正如我所料,因为我重写 testPublic()方法以回显 Foo :: testPublic 。但第二个输出对我来说毫无意义。如果我覆盖 testPrivate()方法,为什么 Bar :: testPrivate ?根据定义,无论如何也不会继承父类的私有方法!这没有道理。为什么父方法被称为???

1 个答案:

答案 0 :(得分:5)

您的代码存在的问题是方法Bar::testPrivateprivate,因此子类无法覆盖它。对于初学者,我建议您阅读PHP中的可见性 - http://www.php.net/manual/en/language.oop5.visibility.php。在那里,您将了解到只能覆盖publicprotected类成员方法/属性,private不能覆盖。{/ p>

举个好例子,尝试将Bar::testPrivate方法的可见性更改为public或protected,而不更改示例代码中的任何其他内容。现在尝试运行测试。怎么了?这样:

  

PHP致命错误:Foo :: testPrivate()的访问级别必须受到保护(如在类Bar中)或更弱

最大的问题是:“为什么?”好吧,您现在已使用私有Bar::testPrivate覆盖Foo:testPrivate。这个新的私有方法超出了Bar::test的范围,因为私有类成员只对其当前类可见, NOT 父/子类!

因此,正如您所看到的,OOP为类成员提供了一定量的封装,如果您没有花时间去理解它,可能会非常混乱。