Php 使用静态变量调用变量函数

Php 使用静态变量调用变量函数,php,Php,方法1可以工作,但方法2不能-它会导致致命错误(函数名必须是…)中的字符串 这不是有点奇怪吗?我希望有人能解释一下 编辑:为了提供一些上下文,这里有一个完整的类: class Example { static $function; static function method() { self::$function(); } } function callback() {} Example::$function = 'callback';

方法1可以工作,但方法2不能-它会导致致命错误(函数名必须是…)中的字符串

这不是有点奇怪吗?我希望有人能解释一下


编辑:为了提供一些上下文,这里有一个完整的类:

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();