我有一个关于一个奇怪的comportement的问题。
看看这段代码:
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 static function __callStatic($name, $args) {
return 'Foo::__callStatic';
}
public function __call($name, $args) {
return 'Foo::__call?';
}
}
$u = new User();
var_dump($u->can('User'));
var_dump($u->can('Foo'));
第一个var转储的结果是: “用户:: __叫” 第二个: “富:: __ callStatic”
为什么第一个不调用函数__callStatic?
PS:我看其他主题,但没有找到解释。
由于
答案 0 :(得分:1)
调用call_user_func
时,这只是范围问题。
当您第一次调用can
函数时,您处于班级User
上下文中,它将需要__call
。在第二次调用中,您的上下文来自第二个类之外,因此它需要__callStatic
。查看callback manual和call-user-func。
例如code:
<?php
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"
答案 1 :(得分:0)
谢谢你们两位。
是的,这是由于上下文,这是PHP的一个错误(修复后来的版本,而不是7.2,所以...;))或者它只是一个奇怪的comportement。 / p>
@Edwin我知道如果我将函数can()
转换为静态,它会起作用,但我不想这样做。要解决&#34;问题&#34;,我只在调用自我类的情况下调用函数__callStatic()
中的函数can()
:
if($name instanceof User)
return self::__callStatic($functionName, $args);