调用call_user_func时,这只是范围问题.
当您第一次调用can函数时,您处于类User环境中,它将需要__call.在第二个调用中,您的上下文来自第二个类之外,因此它需要__callStatic.检查callback manual和call-user-func.
class User
{
public function can($name) {
return call_user_func(array($name, 'test'));
}
public static function __callStatic($name, $args) {
return 'User::__callStatic';
}
public function __call($name, $args) {
return 'User::__call';
}
}
class Foo
{
public function can($name) {
return call_user_func(array($name, 'test'));
}
public static function __callStatic($name, $args) {
return 'Foo::__callStatic';
}
public function __call($name, $args) {
return 'Foo::__call?';
}
}
function can($name) {
return call_user_func(array($name, 'test'));
}
$u = new User();
$f = new Foo();
var_dump($u->can('User'));
var_dump($u->can('Foo'));
var_dump($f->can('User'));
var_dump($f->can('Foo'));
var_dump(can('User'));
var_dump(can('Foo'));
将返回:
string(12) "User::__call"
string(17) "Foo::__callStatic"
string(18) "User::__callStatic"
string(12) "Foo::__call?"
string(18) "User::__callStatic"
string(17) "Foo::__callStatic"