欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  后端开发

PHP中父类调用子类方法

程序员文章站 2022-05-17 15:59:47
...
吃早餐的时候在 这里看到的一个问题,有点意思,一般是不推荐父类调用子类的方法的,但是大家实现方法多样化,了解下也可以。

这种情况下要强约束,不然很容易出现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

点击生成二维码

本文由 程小白

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