ID: 24915 User updated by: tater at potatoe dot com Reported By: tater at potatoe dot com Status: Open Bug Type: Zend Engine 2 problem Operating System: OS X 10.2 PHP Version: 5CVS-2003-11-28 (dev) New Comment:
Oh, I see, you just saw the word "private" and threw a mental exception. OK, here: class foo { public $_x; public function __get($p) { return $this->_x; } public function __set($p,$v) { $this->_x = $v; } } $y = new foo; $y->x = 12; if (empty($y->x)) print "y->x is empty: {$y->x} \n"; else print "y->x is not empty: {$y->x} \n"; if (isset($y->x)) print "y->x is set: {$y->x} \n"; else print "y->x is not set: {$y->x} \n"; Previous Comments: ------------------------------------------------------------------------ [2003-11-29 00:10:05] tater at potatoe dot com This has nothing to do with accessing private or protected properties. The very point of __get()/__set() is that there *is no property at all*. Please try reading the bug description. ------------------------------------------------------------------------ [2003-11-28 21:32:05] [EMAIL PROTECTED] >From ZEND_CHANGES: * Private and Protected Members. The Zend Engine 2.0 introduces private and protected member variables. Note that for performance reasons no error message is emitted in case of an illegal access to a private or protectecd member variable. ------------------------------------------------------------------------ [2003-10-19 13:49:41] myle34 at hotmail dot com Another solution could be to make an issetFoo($variable) function: class foo { ... public function issetFoo($variable) { $variable = '_'.$variable; if (isset($this->$variable)) { return(TRUE); } return(FALSE); } } that should work... ------------------------------------------------------------------------ [2003-09-13 20:50:56] myle34 at hotmail dot com I have the same problem. What I would ideally like it to do is for isset to check whether it gets a legitimate (not NULL) value from __get() and then decide whether the variable passed to isset is set or not. An alternative could be to have an isset_get or something to check that it gets a good (not NULL) value returned from the __get() function. ------------------------------------------------------------------------ [2003-08-02 07:12:58] tater at potatoe dot com Description: ------------ Given a "property" that is really being handled by __get() and __set() functions, you are allowed to use it with empty() and isset() without errors or warnings, but they always report that the property is empty/not-set. I understand that this may not be a bug, but a "feature" of PHP 5 - i.e., just the way it works - but if that is true, please be kind enough to say so explicitly. It is not helpful to mark bugs as Bogus with comments like "I suggest you read ZEND_CHANGES :)" If it is to be expected, it might be good to throw the same kind of error that one would see if trying to use empty() on a function call, if that's possible. This is possibly related to bug #24436. Reproduce code: --------------- class foo { private $_x; private function __get($p) { return $this->_x; } private function __set($p,$v) { $this->_x = $v; } } $y = new foo; $y->x = 12; if (empty($y->x)) print "y->x is empty: {$y->x} \n"; else print "y->x is not empty: {$y->x} \n"; if (isset($y->x)) print "y->x is set: {$y->x} \n"; else print "y->x is not set: {$y->x} \n"; Expected result: ---------------- y->x is not empty: 12 y->x is set: 12 Actual result: -------------- y->x is empty: 12 y->x is not set: 12 ------------------------------------------------------------------------ -- Edit this bug report at http://bugs.php.net/?id=24915&edit=1