首页 > 开发 > php > 正文

PHP类继承的一段代码

2017-09-06 15:07:27  来源:网友分享
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

来自php手册的一段代码,请问最后的输出结果是如何得到的?

子类Foo的对象调用了test()方法,test()方法调用了$this->testPrivate();这个$this此时应该是子类的引用,按理说应该调用子类的testPrivate()方法,实际上却调用了父类的testPrivate()方法,why?

解决方案

这是PHP的动态绑定和静态绑定的一种情况。

public是动态绑定,在编译期不绑定,所以在运行期调用父类的test()方法的时候,会解析为子类的public方法。
而private是私有的,不会继承到子类,在编译期就绑定了,是一种“静态”的绑定(类似5.3后的self)。

与这个相关的是LSB,静态延迟绑定,PHP5.3因为有了这个特性之后,使PHP的OOP得到加强。