首頁 > 後端開發 > php教程 > PHP中父类调用子类方法

PHP中父类调用子类方法

WBOY
發布: 2016-06-23 13:15:51
原創
2464 人瀏覽過

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

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

先看代码

<?phpclass A{    public function run()    {        //我在这里把对象打印出来,方便理解        var_dump($this);        $this->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实际上成了:

<?phpclass B{    public function run()    {        //我在这里把对象打印出来,方便理解        var_dump($this);        $this->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说了,我修饰的东西, 只能在当前类使用,离开了我这里,谁了不能用。

所以就报错了。

继承调用后的分解代码:

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

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

<?phpclass A{    public function run()    {        var_dump($this);        $this->say();    }}class B extends A{    public function run()    {        $this->say();    }    private function say()    {        echo 'B-say';    }}$b = new B();$b->run();//结果:B-say
登入後複製

点击生成二维码

本文由 程小白

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

來源:php.cn
本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn
熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板