Re: Static Class Member References

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



Richard Quadling wrote:
> On 13 July 2010 09:46, Richard Quadling <rquadling@xxxxxxxxx> wrote:
>> On 12 July 2010 22:54, Daniel Kolbo <kolb0057@xxxxxxx> wrote:
>>> Richard Quadling wrote:
>>>> On 11 July 2010 23:19, Daniel Kolbo <kolb0057@xxxxxxx> wrote:
>>>>> Hello PHPers,
>>>>>
>>>>> I'm having some trouble understanding some PHP behaviour.  The following
>>>>> example script exhibits the behaviour which I cannot understand.
>>>>> [code]
>>>>> <?php
>>>>>
>>>>> class A
>>>>> {
>>>>>        public static $a = 3;
>>>>>
>>>>>        function __construct()
>>>>>        {
>>>>>                //self::$a = $this; //[i]
>>>>>                self::$a =& $this; //[ii]
>>>>>        }
>>>>> }
>>>>>
>>>>> class B extends  A
>>>>> {
>>>>>        function __construct()
>>>>>        {
>>>>>                parent::__construct();
>>>>>        }
>>>>> }
>>>>>
>>>>> class C {
>>>>>        var $c;
>>>>>
>>>>>        function __construct()
>>>>>        {
>>>>>                $this->c =& A::$a;
>>>>>        }
>>>>>
>>>>> }
>>>>>
>>>>>
>>>>> $c = new C;
>>>>> $b = new B;
>>>>> $cee = new C;
>>>>>
>>>>> var_dump($c->c); // [i] prints object(B), but [ii] prints int 3
>>>>> var_dump($cee->c); // [i] prints object(B), and [ii] prints object(B)
>>>>>
>>>>> ?>
>>>>> [/code]
>>>>>
>>>>> Why does $c->c print 'int 3' ?
>>>>>
>>>>> I'm nervous to use "self::$a = $this;" because I don't want to be
>>>>> copying the whole object.  However, isn't $this just a reference to the
>>>>> object, so "self::$a = $this;" is just copying the reference and not the
>>>>> actual object, right?
>>>>>
>>>>> Thanks in advance
>>>>
>>>> What do you think the value should be?
>>>>
>>>> A static property is bound to the class and not to an instance of the class.
>>>>
>>>> So, &A::$a is a reference to the static value. If you alter the value,
>>>> it will be altered for a subclasses of A and for any other reference
>>>> to it.
>>>>
>>> I think
>>> var_dump($c->c); would print object(B), but it's printing int 3.
>>>
>>> The reference is *not* being updated.  I think this is a bug.  What do
>>> you think?
>>>
>>> Thanks
> 
> Aha!
> 
> $c = new C;
> 
> At this stage $c->c will be a reference to the static A::$a = 3.
> 
> $b = new B;
> 
> Now, as B's constructor calls A's constructor which replaces the
> static A::$a with a reference to the instance $b, the static A::$a
> should now be $b
> 
> $cee = new C;
> 
> At this stage $cee->c will be a reference to the static A::$a = $b.
> 
> But, when var_dump()'d, $c->c !== $cee->c, and I think they should as
> both have been assigned to a reference of a static.
> 
> It would seem to be a bug.
> 
> I get the same output for V5.0.0 to V5.3.3RC2
> 
Thanks for confirming.  I reported the bug.  I shortened up the test
script quite a bit.  Please see: Bug #52332
http://bugs.php.net/bug.php?id=52332
`

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



[Index of Archives]     [PHP Home]     [Apache Users]     [PHP on Windows]     [Kernel Newbies]     [PHP Install]     [PHP Classes]     [Pear]     [Postgresql]     [Postgresql PHP]     [PHP on Windows]     [PHP Database Programming]     [PHP SOAP]

  Powered by Linux