Heim Backend-Entwicklung PHP-Tutorial PHP中父类调用子类方法

PHP中父类调用子类方法

Jun 23, 2016 pm 01:15 PM

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

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

看到没,在父类中,$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
Nach dem Login kopieren

因为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
Nach dem Login kopieren

如果要有自己的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
Nach dem Login kopieren

点击生成二维码

本文由 程小白

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

Erklärung dieser Website
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn

Heiße Artikel -Tags

Notepad++7.3.1

Notepad++7.3.1

Einfach zu bedienender und kostenloser Code-Editor

SublimeText3 chinesische Version

SublimeText3 chinesische Version

Chinesische Version, sehr einfach zu bedienen

Senden Sie Studio 13.0.1

Senden Sie Studio 13.0.1

Leistungsstarke integrierte PHP-Entwicklungsumgebung

Dreamweaver CS6

Dreamweaver CS6

Visuelle Webentwicklungstools

SublimeText3 Mac-Version

SublimeText3 Mac-Version

Codebearbeitungssoftware auf Gottesniveau (SublimeText3)

11 beste PHP -URL -Shortener -Skripte (kostenlos und Premium) 11 beste PHP -URL -Shortener -Skripte (kostenlos und Premium) Mar 03, 2025 am 10:49 AM

11 beste PHP -URL -Shortener -Skripte (kostenlos und Premium)

Arbeiten mit Flash -Sitzungsdaten in Laravel Arbeiten mit Flash -Sitzungsdaten in Laravel Mar 12, 2025 pm 05:08 PM

Arbeiten mit Flash -Sitzungsdaten in Laravel

Erstellen Sie eine React -App mit einem Laravel -Back -Ende: Teil 2, reagieren Erstellen Sie eine React -App mit einem Laravel -Back -Ende: Teil 2, reagieren Mar 04, 2025 am 09:33 AM

Erstellen Sie eine React -App mit einem Laravel -Back -Ende: Teil 2, reagieren

Vereinfachte HTTP -Reaktion verspottet in Laravel -Tests Vereinfachte HTTP -Reaktion verspottet in Laravel -Tests Mar 12, 2025 pm 05:09 PM

Vereinfachte HTTP -Reaktion verspottet in Laravel -Tests

Curl in PHP: So verwenden Sie die PHP -Curl -Erweiterung in REST -APIs Curl in PHP: So verwenden Sie die PHP -Curl -Erweiterung in REST -APIs Mar 14, 2025 am 11:42 AM

Curl in PHP: So verwenden Sie die PHP -Curl -Erweiterung in REST -APIs

12 Beste PHP -Chat -Skripte auf Codecanyon 12 Beste PHP -Chat -Skripte auf Codecanyon Mar 13, 2025 pm 12:08 PM

12 Beste PHP -Chat -Skripte auf Codecanyon

Benachrichtigungen in Laravel Benachrichtigungen in Laravel Mar 04, 2025 am 09:22 AM

Benachrichtigungen in Laravel

Ankündigung von 2025 PHP Situation Survey Ankündigung von 2025 PHP Situation Survey Mar 03, 2025 pm 04:20 PM

Ankündigung von 2025 PHP Situation Survey

See all articles