<?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::)');
?>
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.
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.
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.