ID: 29917 Updated by: [EMAIL PROTECTED] Reported By: dasch at ulmail dot net Status: Wont fix Bug Type: Feature/Change Request Operating System: * PHP Version: 5.* Assigned To: Andi New Comment:
PHP doesn't become inconsistent. It only doesn't allow to check for the presense of virtual proeprties using isset()/empty(). The problem is that we cannot allow the consistency because that would mean that we need to call __get() for every isset/empty property check where the property is no declared. Also defining a __exists has the same problem. Still we would need to call it for every non declared property. So that is both a major slow down which we cannot overcome by some __get/__set optimizations. Previous Comments: ------------------------------------------------------------------------ [2004-09-09 14:27:06] fch at hexanet dot fr The problem was not that __set() and __get() are slow. The problem is that, if __get() and __set() are defined in an object, PHP becomes "unconsistent", that is to say that some functions like isset() have not these usual behavior if __get() and __set() are defined in an object. And abstract properties is a very strange concept... However, a __get() and __set() optimization is a good idea. Fred. ------------------------------------------------------------------------ [2004-09-03 20:30:43] [EMAIL PROTECTED] We'd need to all __get() for every non existing property then which would be worse than only a mahor slowdown. Een a __exists() would'n help much because that, too. Would be very slow. The only way out would be to declare abstract properties as allowed by this patch: http://marcus-boerger.de/php/ext/ze2/ze2-abstract-properties-20040803.diff.txt ------------------------------------------------------------------------ [2004-09-03 13:48:23] fch at hexanet dot fr <?php class foo implements arrayAccess { private $array = array(); function __construct() {} function __get($key) { return $this->offsetGet($key); } function __set($key, $value) { $this->offsetSet($key, $value); } function offsetExists($key) { return isset($this->array[$key]); } function offsetGet($key) { return $this->array[$key]; } function offsetSet($key, $value) { $this->array[$key] = $value; } function offsetUnset($key) { unset($this->array[$key]; } } $foo = new foo(); echo (isset($foo['bar']) == true ? 'set' : 'not set'); $foo['bar'] = 'bar'; echo (isset($foo['bar']) == true ? 'set' : 'not set'); echo $foo['bar']; #Expected result : # not set # set # bar #Real result # not set # set # bar # !! GREAT !! #Now, the same thing with __get() and __set() unset($foo); $foo = new foo(); echo (isset($foo->array) == true ? 'array is set' : 'array is not set'); echo (isset($foo->bar) == true ? 'bar is set' : 'bar is not set'); $foo->bar = 'bar'; echo (isset($foo['bar']) == true ? 'bar is set' : 'bar is not set'); echo $foo->bar; #Expected result : # array is set # bar is not set # bar is set # bar #Real result # array is set # Ok ! # bar is not set # Ok ! # bar is not set # PROBLEM PROBLEM # bar # !! NOT GREAT !! ?> It is abnormal ! isset() does not return the good value on property wich was set with __set() it is return the good value on property wich was set in the class,and isset() return the good value on value wich was set with offsetSet() method !! It is a paradox ! I think that isset MUST return the same value in all case. ------------------------------------------------------------------------ [2004-09-01 13:51:05] dasch at ulmail dot net If the isset() function aren't going to work with properties accessed with a __get() call, then there should at least be a __isset() method that allows for custom isset()-handling. eg: <?php class Foo { private $bar = "bar"; public function __isset ($prop) { if (isset($this->$prop)) { return TRUE; } else { return FALSE; } } } $foo = new Foo(); echo isset($foo->bar) ? "yes\n" : "no\n"; // Should be the same as echo $foo->__isset('bar') ? "yes\n" : "no\n"; ?> ------------------------------------------------------------------------ [2004-09-01 10:24:01] fch at hexanet dot fr Can you explain where are wrong ??? A call to __set() create a property in the object (see documentation). Event if this property is not a real member property for PHP language point of view, for the programers point of view, it is a property ! So, isset() MUST return true in my example. What are difference between your example : $o->a = 'bar'; echo isset($o->a) ? "yes\n" : "no\n"; And my example : $o->foo = 'bar'; echo (isset($o->foo) == true ? 'foo is set' : 'foo is not set'); There is no difference ! Except that my foo property was created with a __set() call. ------------------------------------------------------------------------ The remainder of the comments for this report are too long. To view the rest of the comments, please view the bug report online at http://bugs.php.net/29917 -- Edit this bug report at http://bugs.php.net/?id=29917&edit=1