调用__call而不是__callstatic在同一个类中,如果调用另一个类
问题描述:
我有一个关于奇怪comportement的问题。调用__call而不是__callstatic在同一个类中,如果调用另一个类
看看这段代码:
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:我看了其他话题,但没有找到解释。
感谢
答
当你调用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"
答
谢谢你们俩。
是的,这是由于背景,是PHP的一个bug(修复以后的版本中,而不是在7.2,所以...;)),或者是它只是一个陌生的comportement。
@Edwin我知道如果我将函数can()
转换为静态,它会工作,但我不想。
if($name instanceof User) return self::__callStatic($functionName, $args);
此代码的工作:要解决“问题”,我只能呼吁自我类的情况下,调用函数
__callStatic()
在我的功能can()
https://3v4l.org/E1gKl – Edwin@Edwin我知道:)这不是我的问题,我希望有第一个var dump的“User :: __ callStatic” –
我发布回应其他评论,现在被删除 – Edwin