3v4l.org

run code in 150+ php & hhvm versions
Bugs & Features
<?php class Test{ static $count = 0; static $instance; /* Attempting to call method() from a non-static method inside the object : * "->" and "::" are 'overriden' by the method's context, * the object context in this case. * __call() is used in both calls. */ public function __construct(){ $this->method('from __construct() in object context ($this->)'); Test::method( 'from __construct() in class context (Test::)'); } public function __call($name, $arguments){ switch($name){ case 'method': self::magicMethod($arguments[0].' __call()'); } } public static function __callStatic($name, $arguments){ switch($name){ case 'method': self::magicMethod($arguments[0].' __callStatic()'); } } public static function magicMethod($arg){ Test::$count++; echo('Call '. self::$count.' : '.$arg."\n"); } /* Attempting to call method() from a non-static method inside the object : * "->" and "::" are 'overriden' by the method's context, * the object context in this case. * __call() is used in both calls. */ public function notMagic(){ $this->method('from notMagic() in object context ($this->)'); Test::method( 'from notMagic() in class context (Test::)'); } /* Calling method() from a static method inside the class : * "->" and "::" work as expected, * __call() is used in the first call. * __callStatic() is used in the second call. */ public static function staticNotMagic(){ Test::$instance->method('from staticNotMagic() in object context (Test::$instance->)'); Test::method('from staticNotMagic() in class context (Test::)'); } } //Behaves oddly (see method comments) $test = new Test(); $test->notMagic(); //Behaves as expected Test::$instance = $test; Test::staticNotMagic(); $test->method('from outside in object context ($test->)'); Test::method( 'from outside in class context (Test::)'); ?>
Output for 5.3.0 - 5.3.2, 5.3.4 - 5.6.28, hhvm-3.10.0 - 3.12.0, 7.0.0 - 7.1.0
Call 1 : from __construct() in object context ($this->) __call() Call 2 : from __construct() in class context (Test::) __call() Call 3 : from notMagic() in object context ($this->) __call() Call 4 : from notMagic() in class context (Test::) __call() Call 5 : from staticNotMagic() in object context (Test::$instance->) __call() Call 6 : from staticNotMagic() in class context (Test::) __callStatic() Call 7 : from outside in object context ($test->) __call() Call 8 : from outside in class context (Test::) __callStatic()
Output for 5.3.3
Call 1 : from __construct() in object context ($this->) __call() Call 2 : from __construct() in class context (Test::) __callStatic() Call 3 : from notMagic() in object context ($this->) __call() Call 4 : from notMagic() in class context (Test::) __callStatic() Call 5 : from staticNotMagic() in object context (Test::$instance->) __call() Call 6 : from staticNotMagic() in class context (Test::) __callStatic() Call 7 : from outside in object context ($test->) __call() Call 8 : from outside in class context (Test::) __callStatic()
Output for 5.2.6 - 5.2.17
Call 1 : from __construct() in object context ($this->) __call() Call 2 : from __construct() in class context (Test::) __call() Call 3 : from notMagic() in object context ($this->) __call() Call 4 : from notMagic() in class context (Test::) __call() Call 5 : from staticNotMagic() in object context (Test::$instance->) __call() Fatal error: Call to undefined method Test::method() in /in/qbFTO on line 56
Process exited with code 255.
Output for 5.0.0 - 5.2.5
Call 1 : from __construct() in object context ($this->) __call() Fatal error: Call to undefined method Test::method() in /in/qbFTO on line 15
Process exited with code 255.
Output for 4.4.2 - 4.4.9
Parse error: syntax error, unexpected T_STATIC, expecting T_OLD_FUNCTION or T_FUNCTION or T_VAR or '}' in /in/qbFTO on line 5
Process exited with code 255.
Output for 4.3.0 - 4.3.1, 4.3.5 - 4.4.1
Parse error: parse error, unexpected T_STATIC, expecting T_OLD_FUNCTION or T_FUNCTION or T_VAR or '}' in /in/qbFTO on line 5
Process exited with code 255.
Output for 4.3.2 - 4.3.4
Parse error: parse error, expecting `T_OLD_FUNCTION' or `T_FUNCTION' or `T_VAR' or `'}'' in /in/qbFTO on line 5
Process exited with code 255.