Php 使用静态变量调用变量函数
方法1可以工作,但方法2不能-它会导致致命错误(函数名必须是…)中的字符串 这不是有点奇怪吗?我希望有人能解释一下Php 使用静态变量调用变量函数,php,Php,方法1可以工作,但方法2不能-它会导致致命错误(函数名必须是…)中的字符串 这不是有点奇怪吗?我希望有人能解释一下 编辑:为了提供一些上下文,这里有一个完整的类: class Example { static $function; static function method() { self::$function(); } } function callback() {} Example::$function = 'callback';
编辑:为了提供一些上下文,这里有一个完整的类:
class Example
{
static $function;
static function method()
{
self::$function();
}
}
function callback() {}
Example::$function = 'callback';
Example::method();
语法对我来说似乎模棱两可。可能它也适用于PHP。将函数名保存在局部变量中会更干净、更实用:
static function method()
$method = self::$function;
$method();
}
或者使用调用\u user\u func()
:
为什么方法1有效
这是PHP运算符优先级的产物
$function = self::$function and $function();
相当于
($function = self::$function) and $function();
这当然相当于
$function = self::$function;
if ($function) $function();
最后一行很好,因为这是的语法
为什么方法2不起作用
因为存在歧义,编译器以“错误的方式”解决
考虑这一点:
self::$function();
这意味着PHP应该调用存储在static
属性$function
中的回调,还是应该调用一个静态方法,其名称是变量$function
的值
PHP使用后者,但在作用域中没有变量
$function
,首先导致一个通知,然后导致一个错误($function
的计算结果为null
,这不是字符串)。如果您不想进入优先级和模糊性的技术细节,简短的解释是self:$function()
按照与$obj->$method()
相同的逻辑工作;它试图调用self
的变量函数$function()
,我需要查看您的类以帮助您。@aguyfromhere,您想查看什么?它可能是一个空类,带有一个静态方法和一个静态变量-$function。我同意@aguyfromhere,你能提供两个完整的例子吗?我不确定我是否理解您在做什么。如果您要在末尾使用()调用函数,它不可能是空类。不,有一个变量self::$function
。这里没有变量$function
。这里的歧义是什么,可以用什么其他方式解释它,为什么错误消息没有说明它。p.s。我对如何使它工作不感兴趣。我知道怎么做。问题说明了这一点。我只对原因感兴趣。模糊性是范围。您是否在$function
上应用函数()
<代码>自身::$function()。因此,答案是:因为这是模棱两可的。如果您真的对技术原因感兴趣,请阅读PHP源代码。@MathieuImbert:这并不是那么模棱两可——您不能将()
应用于$function
,因为唯一合理的结果是表达式作为一个整体计算为静态属性的值,该属性的名称是计算$function()的结果
。但是如果允许,那么Foo::bar()
也应该是“其名称是对自由函数bar
调用求值的结果的Foo
的静态属性值”的候选项。疯狂永远不会结束。只要self::$function()正如您所建议的,代码>,将导致相同的错误。这个问题与比较运算符无关。我在问题中使用它们的唯一原因是为了表示变量不是NULL。@EmanuilRusev:对不起,我一点也不明白。你指的是1还是2?什么比较运算符?对不起,我指的是逻辑运算符。@EmanuilRusev:所以我对#1的解释没有告诉你任何你没有想到的东西?我很难理解你到底反对什么。是的。这与逻辑运算符无关。如果这个问题没有说清楚,我很抱歉。deceze的最后一个注释给出了答案。它要么忽略self::
,要么将self
视为当前函数的范围。
$function = self::$function;
if ($function) $function();
self::$function();