php - Call method recursively through class hierarchy -
i want call recursively parent methods :
<?php class generation1 { public function whoami() { echo get_class($this).php_eol; } public function awesome() { // stop recursion $this->whoami(); } } class generation2 extends generation1 { public function awesome() { $this->whoami(); parent::awesome(); } } class generation3 extends generation2 {} class generation4 extends generation3 {} $gen = new generation4(); $gen->awesome(); the output :
generation4
generation4
i have :
generation4
generation3
generation2
generation1
the __class__ magic constant not interpreted being whatever concrete class instance is, instead evaluates class name constant contained in.
if want concrete class name (rather base class name), try using get_class() instead.
<?php class { public function test1() { echo __class__ . "\n"; } public function test2() { echo get_class($this) . "\n"; } } class b extends {} $b = new b; $b->test1(); $b->test2(); output:
a
b
update
in particular situation, there two awesome methods; 1 defined on generation2 , 1 defined on generation1. generation3 , generation4 rely on ancestor's definitions, , not called inside of context (this why see two outputs, there's 2 methods called).
you around defining awesome method @ every level have written. trouble $this->whoami() line. $this in each of contexts referring concrete instance of generation4 object, @ generation2 level calling $this->whoami() inside of awesome method cause method on generation4 called of awesome methods.
you can around limitation, too, changing $this self. final solution able come this:
class gen1 { public function whoami() { echo __class__ . php_eol; } public function awesome() { self::whoami(); } } class gen2 extends gen1 { public function whoami() { echo __class__ . php_eol; } public function awesome() { self::whoami(); parent::awesome(); } } class gen3 extends gen2 { public function whoami() { echo __class__ . php_eol; } public function awesome() { self::whoami(); parent::awesome(); } } class gen4 extends gen3 { public function whoami() { echo __class__ . php_eol; } public function awesome() { self::whoami(); parent::awesome(); } } $gen4 = new gen4; $gen4->awesome(); which gives output of:
gen4
gen3
gen2
gen1
you may able around of these limitations if have php 5.5 installed (i on 5.4 locally right now, can't test this), see this answer other possibilities.
Comments
Post a Comment