PHP __get magic method unexpected behaviour -
i have following classes.
class book { protected $name; protected $cost; protected $description; public function __construct(){ $this->name = 'the x'; $this->cost = 19.95; $this->description = 'something x'; } public function __get($variable){ return $this->$variable; } }
class readerabstract { protected $_book; public function __construct(){ if(null == $this->_book){ $this->_book = new book(); } } public function __get($variable){ $method = 'get'.ucwords($variable); if(method_exists($this, $method)){ return $this->$method(); } return $this->getbook()->__get($variable); } public function getbook(){ return $this->_book; } }
class reader extends readerabstract { public function getcost(){ return round($this->cost, 2); //return round($this->getbook()->cost, 2); doing works expected } }
now if this.
$reader = new reader(); echo $reader->name; //this should work echo '<br />'; echo $reader->cost; //this should go infinite loop echo '<br />'; echo $reader->description; //this should work
the code above works fine expect statement echo $reader->cost;
throws "undefined property: reader::$cost"
error.
my questions here are:
why can't access property
$cost
?shouldn't call $cost property trigger infinite loop? i.e. each time call $reader->cost call gets redirected getcost() method , inside getcost() method if call $this->cost shouldn't call method getcost() creating infinite loop?
thanks help.
the problem __get
method not reentrant, when access $reader->cost
called first time , call reader::getcost()
, $this->cost
forces php recursive call __get
denied.
i don't know if it's bug or feature. read this page php manual , search 'recursi' further reading.
Comments
Post a Comment