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
看到没,在父类中,$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
点击生成二维码
本文由 程小白创作,本文可自由转载、引用,但需署名作者且注明文章出处。

Heißer Artikel

Hot-Tools-Tags

Heißer Artikel

Heiße Artikel -Tags

Notepad++7.3.1
Einfach zu bedienender und kostenloser Code-Editor

SublimeText3 chinesische Version
Chinesische Version, sehr einfach zu bedienen

Senden Sie Studio 13.0.1
Leistungsstarke integrierte PHP-Entwicklungsumgebung

Dreamweaver CS6
Visuelle Webentwicklungstools

SublimeText3 Mac-Version
Codebearbeitungssoftware auf Gottesniveau (SublimeText3)

Heiße Themen

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

Arbeiten mit Flash -Sitzungsdaten in Laravel

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

Vereinfachte HTTP -Reaktion verspottet in Laravel -Tests

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

12 Beste PHP -Chat -Skripte auf Codecanyon

Ankündigung von 2025 PHP Situation Survey
