Re: Static Class Member References
| From: | Richard Quadling | Date: | Tue, 13 Jul 2010 08:46:06 +0000 |
| Subject: | Re: Static Class Member References | ||
| References: | 1 2 3 | Groups: | php.general |
| Request: | Send a blank email to php-general+get-306859@lists.php.net to get a copy of this message | ||
On 12 July 2010 22:54, Daniel Kolbo <kolb0057@umn.edu> wrote:
> Richard Quadling wrote:
>> On 11 July 2010 23:19, Daniel Kolbo <kolb0057@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
> `
>
>
What version of PHP are you using?