ID: 48714 Updated by: j...@php.net Reported By: sebcorne at gmail dot com -Status: Open +Status: Bogus Bug Type: Scripting Engine problem Operating System: Windows PHP Version: 5.3.0RC4 New Comment:
Thank you for taking the time to write to us, but this is not a bug. Please double-check the documentation available at http://www.php.net/manual/ and the instructions on how to report a bug at http://bugs.php.net/how-to-report.php Previous Comments: ------------------------------------------------------------------------ [2009-06-30 17:12:14] sebcorne at gmail dot com Yes, it's documented : "it might give unexpected results in so-called edge cases" I see two problems : - self class respond - "__call()" is called instead of "__callstatic()" There is not means to solve that ? ------------------------------------------------------------------------ [2009-06-30 14:05:51] sjoerd-php at linuxonly dot nl Thank you for your bug report. Are you sure the behavior you describes is not documented? Please take a look at: http://nl.php.net/manual/en/language.oop5.late-static-bindings.php#language.oop5.late-static-bindings.edge-cases ------------------------------------------------------------------------ [2009-06-30 05:45:29] sebcorne at gmail dot com class base { static public function __callstatic($name, $arguments) { echo get_called_class() . "::$name() is called \n\n"; } public function __call($name, $arguments) { echo get_called_class() . "->$name() is called \n\n"; } } give the same result. but without "__call()", it's ok. if "$this" exists in inheritance, "__call()" (of $this) is called instead of "__callstatic()" ------------------------------------------------------------------------ [2009-06-29 09:17:57] sebcorne at gmail dot com Description: ------------ Tested on php5.3.0-alpha3 (must be tested on last snap) When calling parent class method, self is responding (sorry for my bad english) Reproduce code: --------------- class base { public function __call($name, $arguments) { echo get_called_class() . "->$name() is called \n\n"; } } class A extends base { public function parent_automatic() { $parentclass = get_parent_class($this); echo get_class($this) . '->'. __FUNCTION__ ."() call $parentclass::test() \n"; $parentclass::test(); } public function parent_manual() { echo get_class($this) . '->'. __FUNCTION__ ."() call A::test() \n"; A::test(); } } class B extends A {} $b = new B; $b->parent_automatic(); $b->parent_manual(); Expected result: ---------------- B->parent_automatic() call A::test() A->test() is called B->parent_manual() call A::test() A->test() is called Actual result: -------------- B->parent_automatic() call A::test() B->test() is called B->parent_manual() call A::test() B->test() is called ------------------------------------------------------------------------ -- Edit this bug report at http://bugs.php.net/?id=48714&edit=1