ID: 29917
User updated by: dasch at ulmail dot net
Reported By: dasch at ulmail dot net
Status: Bogus
Bug Type: Class/Object related
Operating System: Linux
PHP Version: 5.0.1
New Comment:
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";
?>
Previous Comments:
------------------------------------------------------------------------
[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 !!
------------------------------------------------------------------------
[2004-09-01 08:41:52] [EMAIL PROTECTED]
This works fine for me:
[EMAIL PROTECTED]:~$ cat bug29917.php
<?php
class oo {
var $a;
}
$o = new oo;
echo isset($o->a) ? "yes\n" : "no\n";
$o->a = 'bar';
echo isset($o->a) ? "yes\n" : "no\n";
?>
[EMAIL PROTECTED]:~$ php bug29917.php
no
yes
Come up with a short example like mine that shows that it doesn't work.
Just saying $o->a won't work doesn't help.
------------------------------------------------------------------------
[2004-08-31 19:35:52] dasch at ulmail dot net
Still not resolved, you still have to use the following code to access
the properties:
$a = $o->a;
echo isset($a) ? "yes\n" : "no\n";
Another guy thought that it would be neat if there was a __isset magic
method.
------------------------------------------------------------------------
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