ID: 29917
Comment by: fch at hexanet dot fr
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:
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.
Previous Comments:
------------------------------------------------------------------------
[2004-09-03 20:30:43] helly@php.net
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.
------------------------------------------------------------------------
[2004-09-01 10:14:10] derick@php.net
No, you're wrong. The behavior you see is the correct behavior.
------------------------------------------------------------------------
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