搜索

首页  >  问答  >  正文

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

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

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

黄舟黄舟2896 天前451

全部回复(3)我来回复

  • 高洛峰

    高洛峰2017-04-10 13:12:27

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

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

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

    回复
    0
  • ringa_lee

    ringa_lee2017-04-10 13:12:27

    public: 可以被继承,也可以被外部调用。
    private: 不可以被继承,也不可以被外部调用。
    protected: 可以被继承,但不能被外部调用。

    回复
    0
  • PHPz

    PHPz2017-04-10 13:12:27

    因为你调用的是$myFoo的test的方法,这个方法是继承来的,this指向的是$myFoo实例自己。
    所以调用的是Foo的testPublic方法。
    不过不明白为什么testPrivate调用的是父类的

    回复
    0
  • 取消回复