Edit report at http://bugs.php.net/bug.php?id=52741&edit=1
ID: 52741 User updated by: flyguy dot by at gmail dot com Reported by: flyguy dot by at gmail dot com Summary: OOP late static bindings bug Status: Assigned Type: Bug Package: Scripting Engine problem Operating System: * PHP Version: 5.3.3 Assigned To: colder Block user comment: N New Comment: Sory, my English is very bad :)) Previous Comments: ------------------------------------------------------------------------ [2010-09-13 22:46:23] flyguy dot by at gmail dot com class my_parent { public static $blabla='asd'; public static function set_blabla($val) { static::$blabla=$val; } } class my_child extends my_parent { } my_child::set_blabla('qwerty'); var_dump(my_child::$blabla); var_dump(my_parent::$blabla); -------- prints: string 'qwerty' (length=6) string 'qwerty' (length=6) ---- This is normal code too ? Why changed extended propety on parent ? By your logic inherited properties are not inherited properties. Simply class-parent becomes part of the subclass. ------------------------------------------------------------------------ [2010-09-13 21:42:17] col...@php.net parent:: forwards LSB information In the initial case, it makes it perfectly normal for get_called_class to return test2, this is by design, if you don't want to pass the LSB info, reference your class by name, without keyword (i.e. test1::testing_method()). --- Johannes: on test3::testingmethod(): - parent::testing_method() will call parent (here test2), passing LSB info (test3) - test2::testing_method falls back to test1::method, passing LSB info test1::testing_method's get_called_class will be test3. To me it sounds perfectly normal? --- For the last comment: static::$field is resolved to once my_child::$field and once my_parent::$field, my_child::$field falls back to my_parent::$field, and updates it. => normal again Am I missing something here? ------------------------------------------------------------------------ [2010-09-13 00:13:13] flyguy dot by at gmail dot com Ok. This situation is analogous to the one hand, but why then: class my_parent { public static $field; public static function field_setup() { static::$field='asd'; } } class my_child extends my_parent { } my_child::field_setup(); var_dump(my_child::$field); var_dump(my_parent::$field); ---------- prints: string 'asd' (length=3) string 'asd' (length=3) ------------------------------------------------------------------------ [2010-08-30 18:35:08] johan...@php.net Etienne, you are the LSB expert - what's your take on this? - In the given example I can see the reporter's point. (While there is a "extends test1" missing) I wonder about this: class test1 { public static function testing_method() { var_dump(get_called_class()); } } class test2 extends test1 { } class test3 extends test2 { public static function testing_method() { parent::testing_method(); } } Here parent might refer to test2, test2 inherits testing_method() from test1 so the called class might be test2 ... some might argue that test1 is correct. I think the most simple thing is to keep the current behavior and define parent not to change the lsb scope. ------------------------------------------------------------------------ [2010-08-30 17:33:48] flyguy dot by at gmail dot com Description: ------------ This is code prints "test2". Why ? Test script: --------------- class test1 { public static function testing_method() { var_dump(get_called_class()); } } class test2 { public static function testing_method() { parent::testing_method(); } } ------------------------------------------------------------------------ -- Edit this bug report at http://bugs.php.net/bug.php?id=52741&edit=1