4

方法 1会起作用,但方法 2不会——它会导致致命错误(函数名称必须是...中的字符串

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

3 回答 3

1

语法对我来说似乎模棱两可。可能它也适用于 PHP。将函数名称保存在局部变量中会更干净,更实用:

static function method()
  $method = self::$function;
  $method();
}

或使用call_user_func()

static function method()
  call_user_func(self::$function);
}
于 2013-03-02T22:20:35.817 回答
1

为什么方法#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,这不是字符串)。

于 2013-03-02T22:41:48.890 回答
1

如果您不想深入了解优先级和歧义的技术细节,简短的解释是self::$function()根据与 ; 相同的逻辑工作$obj->$method()。它试图调用 的变量函数$function()self

于 2013-03-02T23:13:09.003 回答