方法1 可行,但方法2 不会 - 它会导致致命错误(函数名称必须是...中的字符串< / em>的)
# Approach 1
$function = self::$function and $function();
# Approach 2
self::$function and self::$function();
这不是有点奇怪吗?我希望有人能解释一下。
编辑:为了给出一些背景,这里是一个完整的类:
class Example
{
static $function;
static function method()
{
self::$function();
}
}
function callback() {}
Example::$function = 'callback';
Example::method();
答案 0 :(得分:1)
语法对我来说似乎含糊不清。可能它也适用于PHP。将函数名称保存在局部变量中会更干净,更实用:
static function method()
$method = self::$function;
$method();
}
或使用call_user_func()
:
static function method()
call_user_func(self::$function);
}
答案 1 :(得分:1)
这是PHP运算符优先级的工件。
$function = self::$function and $function();
相当于
($function = self::$function) and $function();
当然等同于
$function = self::$function;
if ($function) $function();
最后一行正常,因为这是variable functions的语法。
因为存在歧义,编译器以“错误的方式”解决了这个问题。
考虑一下:
self::$function();
这是否意味着PHP应该调用存储在static
属性$function
中的回调,或者它应该调用一个静态方法,其名称是变量$function
的值?< / p>
PHP与后者有关,但是范围内没有变量$function
,首先是通知,然后是错误($function
计算为null
,这不是字符串)
答案 2 :(得分:1)
如果您不想了解优先级和含糊不清的技术细节,简短的解释是self::$function()
的工作原理与$obj->$method()
相同;它试图调用$function()
的变量函数self
。