[UPHPU] Child class references static variable of parent instead of its own

Richard K Miller richardkmiller at gmail.com
Fri Aug 17 10:30:24 MDT 2007


On Aug 16, 2007, at 5:48 PM, Alvaro Carrasco wrote:

> Richard K Miller wrote:
>> Here's an OOP question that perplexes me. It seems PHP doesn't  
>> treat static variables correctly in child classes.
>>
>> <?php
>>     class ABC {
>>         public $regular_variable = "Regular variable in ABC\n";
>>         public static $static_variable = "Static variable in ABC\n";
>>             public function regular_function() {
>>             echo $this->regular_variable;
>>         }
>>                public static function static_function() {
>>             echo self::$static_variable;
>>         }
>>     }
>>
>>     class DEF extends ABC {
>>         public $regular_variable = "Regular variable in DEF\n";
>>         public static $static_variable = "Static variable in DEF\n";
>>     }
>>
>>     $abc = new ABC();
>>     $abc->regular_function();
>>     ABC::static_function();
>>
>>     $def = new DEF();
>>     $def->regular_function();
>>     DEF::static_function();
>> ?>
>>
>> WHAT I EXPECTED:
>> Regular variable in ABC
>> Static variable in ABC
>> Regular variable in DEF
>> Static variable in DEF
>>
>> ACTUAL OUTPUT:
>> Regular variable in ABC
>> Static variable in ABC
>> Regular variable in DEF
>> Static variable in ABC <--- This is different from what I expected
>>
>> Anyone know why?
>>
>> Richard
>>
>>
> "self" is bound to the class at compile time, not at runtime. So  
> when you do:
>
> echo self::$static_variable
>
> It's the same as doing
>
> echo ABC::$static_variable
>
> because "self" was bound to ABC when the class was defined.
> It is more of an implementation limitation in php than an intended  
> feature.
>
> For version 6, the php dev team is considering to do late-static  
> binding, which would bind "self" to a class at runtime instead of  
> compile time, but they haven't flushed out all of the details.
>
> Alvaro
>

Alvaro, thanks for this explanation; this was very helpful. I  
sincerely hope that PHP6 implements late static binding.

Do you see anyway around this? My parent class is a generic database  
table wrapper to provide ORM mapping. Each child class maps to a  
specific table. I'd like to implement several static functions such  
as search_by(), a factory pattern that returns an object or objects  
of its own class that match the search. I see no way to define the  
database table in a child class and have it passed back to a static  
function in the parent class.

Richard




More information about the UPHPU mailing list