素材牛VIP会员
PHP类继承的一段代码
 钱***8  分类:PHP代码  人气:764  回帖:3  发布于6年前 收藏
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

讨论这个帖子(3)垃圾回帖将一律封号处理……

Lv3 码奴
赵***3 移动开发工程师 6年前#1

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

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

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

Lv6 码匠
co***ky Linux系统工程师 6年前#2

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

Lv6 码匠
奇***士 移动开发工程师 6年前#3
public: 可以被继承,也可以被外部调用。
private: 不可以被继承,也不可以被外部调用。
protected: 可以被继承,但不能被外部调用。
 文明上网,理性发言!   😉 阿里云幸运券,戳我领取