当前位置:Gxlcms > PHP教程 > PHP中父类调用子类方法

PHP中父类调用子类方法

时间:2021-07-01 10:21:17 帮助过:20人阅读

吃早餐的时候在 这里看到的一个问题,有点意思,一般是不推荐父类调用子类的方法的,但是大家实现方法多样化,了解下也可以。

这种情况下要强约束,不然很容易出现bug!因为在继承关系中,父类是不知道子类的,这种情况必须要使用接口或者抽象类来约束!

先看代码

say();    }}class B extends A{    protected function say()    {        echo 'B-say';    }}$b = new B();$b->run();//结果:object(B)#1 (0) { } B-say

看到没,在父类中,$this已经指向了B。

我把继承分解出来,B实际上成了:

say();    }    protected function say()    {        echo 'B-say';    }}$b = new B();$b->run();//结果:object(B)#1 (0) { } B-say

因为B会继承A的方法,所以看来好像是父类A成功调用了子类B的方法。

至于问题中提及到say()方法变成private后,就出现调用失败的问题。这个是private的范围起的作用。

我们来看下run()继承的实质。

分解后的代码中B类中确实有了run(),但是这个run()是属于它老爹A的,它只能“借来”用,“产权”属于B,所以调用run()的时候,要跑去老爹A那里用。

注意,跑去老爹A那里用的时候, 使用环境是就是A了

但是private说了,我修饰的东西, 只能在当前类使用,离开了我这里,谁了不能用。

所以就报错了。

继承调用后的分解代码:

say();//在外部new B对象调用private方法,失败    }}class B extends A{    private function say()    {        echo 'B-say';    }}$b = new B();$b->run();//结果:PHP Fatal error

如果要有自己的run方法,就会要用的重写了。

say();    }}class B extends A{    public function run()    {        $this->say();    }    private function say()    {        echo 'B-say';    }}$b = new B();$b->run();//结果:B-say

点击生成二维码

本文由 程小白

创作,本文可自由转载、引用,但需署名作者且注明文章出处。

人气教程排行