Actually i think no property is created; not in the sense of
real object property.
    The only "real" property of the object is $elem.
    The $o->a, and $o->b are, IMHO, not object properties;
It is true that one can access $o->a and $o->b, but what is actually
returned is a member of the array $elem, and only because of the
implementation of the magic functions __set and __get.
    isset() does test for an "actual" variable beeing set, which is 
definetely
not the case.
    I agree however that this is confusing. I am definetely puzzled by the
usefullness of these methods since i consider this to be a real error trap;
it would be so easy to fill up an object with values without knowing
what they are and what they are supposed to do and when developing some
kinda library, things can get really messy.
    On my part I would stick with the usual declaration of properties and 
not
use __set() and __get().
    I think it's much cleaner to say:
class OO {
    /** this is variable a and means ... */
    public $a;
    /** this is variable a and means ... */
    public $b;
}

cheers,
Catalin


""Frédéric hardy"" <[EMAIL PROTECTED]> wrote in message 
news:[EMAIL PROTECTED]
> Yes.... but not :-).
>
> With you use these magic functions, when you write $o->a = 'foo', you 
> create a property in the object. Not ? Even if it is stored in an array 
> member, __set() create a property and __get() retrieve its value.
>
> Doc says :
>
> >The $name parameter used is the name of the variable that should
> > be set or retrieved.
> >The __set() method's $value parameter specifies the value that
> > the object should set set the $name.
>
> Conclusion :
>
> class OO
> {
>    private $elem = array();
>    public function __get ($prop)
>    {
>       if (isset($this->elem[$prop])) {
>          return $this->elem[$prop];
>    }
>    else
>    {
>       return NULL;
>    }
>
>    public function __set ($prop, $val)
>    {
>       $this->elem[$prop] = $val;
>    }
> }
>
> $o = new OO();
> echo isset($o->a) ? "yes\n" : "no\n"; # Must return false and return false 
> effectively, cool
> $o->a = 'foo';
> echo isset($o->a) ? "yes\n" : "no\n"; # Must return false and return false 
> effectively, NOT COOL
>
> Fred.
>
>
> Catalin Trifu wrote:
>
>>         Hi,
>>
>>     Is this really a bug. I think not.
>>     There is no variable $o->a or $a->b in the class OO
>> there is only the variable $elem and $a and $b is a member
>> of that array
>>     So ...
>>     The fact that PHP5 provides __set and __get magic
>> functions does not mean that the actual variables exist with
>> that particular name in the class ?
>>     Perhaps it would be nice to have a __isset magic function ?
>>
>> Cheers
>> Catalin
>>
>>
>>
>>><?php
>>>
>>>class OO
>>>{
>>>private $elem = array("a" => 1);
>>>
>>>public function __get ($prop)
>>>{
>>>if (isset($this->elem[$prop])) {
>>>return $this->elem[$prop];
>>>} else {
>>>return NULL;
>>>}
>>>}
>>>
>>>public function __set ($prop, $val)
>>>{
>>>$this->elem[$prop] = $val;
>>>}
>>>}
>>>
>>>$o = new OO();
>>>
>>>echo isset($o->a) ? "yes\n" : "no\n";
>>>echo isset($o->b) ? "yes\n" : "no\n";
>>>
>>>echo is_null($o->a) ? "yes\n" : "no\n";
>>>echo is_null($o->b) ? "yes\n" : "no\n";
>>>
>>>?>
>>>
>>>I expected something like this:
>>>
>>>yes
>>>no
>>>no
>>>yes
>>>
>>>But got this:
>>>
>>>no
>>>no
>>>no
>>>yes
>>>
>>>It looks like isset() can't handle object properties correctly. I'll post 
>>>the bug on php.net.
>>>
>>>-- 
>>>Daniel Schierbeck
>>
>>
>
> -- 
> ===================================================================
> Frederic HARDY                        Email: [EMAIL PROTECTED]
> HEXANET SARL                          URL: http://www.hexanet.fr/
> ZAC Les Charmilles                    Tel: +33 (0)3 26 79 30 05
> 3, allée Thierry Sabine               Direct: +33 (0)3 26 61 77 84
> BP 202 - 51686 REIMS CEDEX 2 FRANCE
> =================================================================== 

-- 
PHP General Mailing List (http://www.php.net/)
To unsubscribe, visit: http://www.php.net/unsub.php

Reply via email to