On 13 July 2010 09:46, Richard Quadling <rquadl...@gmail.com> wrote:
> On 12 July 2010 22:54, Daniel Kolbo <kolb0...@umn.edu> wrote:
>> Richard Quadling wrote:
>>> On 11 July 2010 23:19, Daniel Kolbo <kolb0...@umn.edu> 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

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

Reply via email to