ID: 29917 Updated by: [EMAIL PROTECTED] Reported By: dasch at ulmail dot net -Status: Bogus +Status: Wont fix -Bug Type: Class/Object related +Bug Type: Feature/Change Request -Operating System: Linux +Operating System: * -PHP Version: 5.0.1 +PHP Version: 5.* -Assigned To: +Assigned To: Andi New Comment:
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 Previous Comments: ------------------------------------------------------------------------ [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. ------------------------------------------------------------------------ [2004-09-01 10:14:10] [EMAIL PROTECTED] No, you're wrong. The behavior you see is the correct behavior. ------------------------------------------------------------------------ [2004-09-01 09:59:01] fch at hexanet dot fr <?php class OO { private $array = array(); function __construct() {} function __set($name, $value) { $this->array[$name] = $value; } function __get($name) { if (isset($this->array[$name]) == true) return null; else return $this->array[$name]; } } $o = new oo(); $o->foo = 'bar'; echo (isset($o->foo) == true ? 'foo is set' : 'foo is not set'); #Expecting result # => foo is set #Real result # => foo is not set ?> If PHP provide __set() and __get() function in order to create property dynamicaly, PHP function like isset() MUST BE USED with these "dynamic" properties as usual. So, in my example, isset() MUST return TRUE !! and not FALSE !! ------------------------------------------------------------------------ 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