为什么php允许覆盖私有方法?

时间:2014-09-10 04:27:59

标签: php override private

在文档中是这个例子并且没有问题地理解它

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
  • 富:: testPublic

但现在重新定义类foo中的test()方法

 class Bar{
    public function test() {
        echo '<br>Im Bar::test';
        $this->testPrivate();
        $this->testPublic();
    }
    public function testPublic() {
        echo "<br>Bar::testPublic\n";
    }
    private function testPrivate() {
        echo "<br>Bar::testPrivate\n";
    }
}
class Foo extends Bar{
    public function test() {
        echo '<br>Im Foo::test';
        $this->testPrivate();
        $this->testPublic();
    }
    public function testPublic() {
        echo "<br>Foo::testPublic\n";
    }
    private function testPrivate() {
        echo "<br>Foo::testPrivate\n";
    }
}
$myFoo = new Foo();
$myFoo->test(); 

结果是:

  • Im Foo :: test
  • 富:: testPrivate
  • 富:: testPublic

php允许我覆盖私有方法testPrivate(),为什么?

1 个答案:

答案 0 :(得分:1)

为什么不呢?很难回答这个问题,因为它只是PHP的工作方式。如果您想禁止覆盖您的方法,则可以使用final关键字。

此外,在您的示例中,如果您未在Foo中声明私有方法,则会出现错误,因为Foo在技术上没有该方法的定义。 扩展类无法查看其父类中的任何私有属性或方法。