【问题标题】:why php allow to overwriting private method?为什么php允许覆盖私有方法?
【发布时间】:2014-11-03 14:57:23
【问题描述】:

文档中有这个例子,理解起来没有问题

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

结果是:

  • 酒吧::testPrivate
  • Foo::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(); 

结果是:

  • 我是 Foo::test
  • Foo::testPrivate
  • Foo::testPublic

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

【问题讨论】:

    标签: php overriding private


    【解决方案1】:

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

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

    【讨论】:

    • 但是文档说Members declared as private may only be accessed by the class that defines the member.
    • 只有在我重新定义测试方法时才会重新定义私有函数
    • 在你的例子中,你打电话给Foo::test();。当您使用$this 调用方法时,如果没有定义,它将尝试调用它自己的定义中的方法,然后返回到父级。在您的示例中,您实际上创建了一个新类 (Foo),因为您已经覆盖了所有方法。 Foo::test 正在调用 Foo::testPrivateFoo::testPublic
    • 如果要调用在扩展类的父类中定义的方法,请使用parent::{method}() - 例如。 parent::testPrivate()
    • 我明白了,那么可见性并不意味着您不能再覆盖子类中的私有方法。非常感谢
    猜你喜欢
    • 1970-01-01
    • 2012-03-11
    • 2011-10-09
    • 1970-01-01
    • 2013-11-12
    • 1970-01-01
    • 1970-01-01
    • 2021-07-20
    • 2012-07-14
    相关资源
    最近更新 更多