ID: 30002 Updated by: [EMAIL PROTECTED] Reported By: orlum at mail dot ru -Status: Assigned +Status: Bogus Bug Type: Zend Engine 2 problem Operating System: * PHP Version: 5CVS-2005-03-07 Assigned To: andi New Comment:
Thank you for taking the time to write to us, but this is not a bug. Please double-check the documentation available at http://www.php.net/manual/ and the instructions on how to report a bug at http://bugs.php.net/how-to-report.php __get is not recursive - i.e., fetches happening in __get would not invoke __get again for the same object. Indeed, this is loop protection and also feature allowing __get to access/create properties that other methods would use __get for. Previous Comments: ------------------------------------------------------------------------ [2005-04-22 13:18:47] [EMAIL PROTECTED] I really doubt that it's a bug because if we allow calling __get() from __get() you'll get into endless loop easily, which is of course much worse than just a notice. Take a look into zend_std_read_property() (in zend_object_handlers.c), there is simple loop protection. So I'd prefer more to see this documented than fixed in some way. ------------------------------------------------------------------------ [2005-02-12 18:06:30] imperior at op dot pl Another exaple, where IMHO it should work: <?php class Creator { public $objects; public function __get($name) { if (!isset($this->objects[$name])) { $this->objects[$name] = new $name($this); } return $this->objects[$name]; } } class Class1 { public function __construct($Creat) { echo 'Class1'; $Creat->Class2; } } class Class2 { public function __construct($Creat) { echo 'Class2'; } } $Creat = new Creator; $Creat->Class1; ?> OUTPUT: Class1 Notice: Undefined property: Creator::$Class2 in D:\Server\www\noname\test.php on line 17 Expected: Class1Class2 ------------------------------------------------------------------------ [2004-09-06 21:46:32] [EMAIL PROTECTED] Interesting thing: 1) It should happen at all because using $this->B should result in an implicitly declared proeprty. 2) It is expected behavior because __get/__set have a simple recursion protection which disables __get/__set during __get/__set calls. ------------------------------------------------------------------------ [2004-09-06 18:51:46] orlum at mail dot ru Description: ------------ When __get method accesses other property in some class, expected call to __get method not occurs, undefined property notice appears and null value of property returns. Reproduce code: --------------- <?PHP class A { public function __get($property) { echo "__get()\n"; if ($property == "B") return 1; elseif ($property == "C") return $this->B; } } error_reporting(E_ALL); $a = new A(); echo "B={$a->B}\n"; echo "C={$a->C}\n"; ?> Expected result: ---------------- __get() B=1 __get() __get() C=1 Actual result: -------------- __get() B=1 __get() Notice: Undefined property: A::$B in PHPDocument1 on line 12 C= ------------------------------------------------------------------------ -- Edit this bug report at http://bugs.php.net/?id=30002&edit=1