Php 如何调用存储在静态数组中的匿名函数?

Php 如何调用存储在静态数组中的匿名函数?,php,arrays,class,anonymous-function,Php,Arrays,Class,Anonymous Function,我试图将匿名函数存储在类的静态数组属性中。这些函数稍后应该通过它们的索引调用,但是调用 self::$arr['index']() 只是不起作用,而 $a = self::$arr['index']; $a(); 是的 这不起作用: class A { private static $func = array('a' => ''); public function __construct() { self::$func['a'] = create_fun

我试图将匿名函数存储在类的
静态数组
属性中。这些函数稍后应该通过它们的索引调用,但是调用

self::$arr['index']()
只是不起作用,而

$a = self::$arr['index'];
$a();
是的

这不起作用:

class A {
    private static $func = array('a' => '');
    public function __construct() {
        self::$func['a'] = create_function('$str', 'echo "$str";');
    }
    public function go($str) {
        self::$func['a']($str);  // Call the function directly
    }
}
$a = new A();
$a->go("hooray");  // Outputs "Undefined variable: func"
但这确实:

class A {
    private static $func = array('a' => '');
    public function __construct() {
        self::$func['a'] = create_function('$str', 'echo "$str";');
    }
    public function go($str) {
        $a = self::$func['a'];  // Pass the function name to a variable
        $a($str);               // Call the function via the variable
    }
}
$a = new A();
$a->go("hooray");  // Outputs "hooray"
为什么?


我使用的是PHP版本5.4.3,在PHP中你根本无法做到这一点,这是一个PHP特性。但您可以使用
call\u user\u func
或其亲属:

return call_user_func(self::$func['$a'], $str);

这是php解析器的行为

$functionName['a'] = "hello";
self::$functionName['a']();
召唤

。。。非常可悲的是,在php中,您无法做到这一点:

(self::$functionName['a'])(); // doesn't work in php :(
例如,您可以在javascript中这样做

你能做的是。。。像你说的那样使用一个临时变量

$a = self::$func['a'];
$a($parameter);

希望这有助于


在最新的PHP中添加了这些功能

$a['sss'] = function(){ echo 'bla'; };
$a['sss']();

class Bla
{
    private $a;
    function test()
    {
        $this->a['sss'] = function(){ echo 'bla2'; };
        $this->a['sss']();
    }
}
$c = new Bla();
$c->test();

而且它们工作正常。。。因此,出于某种原因,这种语法不仅在使用范围解析操作符(ClassName::self::etc)时有效。

这是PHP解析器当前工作方式的结果。由于函数调用
()
是在静态运算符
::
之前计算的,因此解析器最终尝试引用局部变量
$func
,然后给出$func未定义的错误信息(这是因为方法中没有名为
$func
的变量)

正如您所发现的,您可以通过执行两个单独的语句来解决这个问题

call_user_func(self::$func['a'], $parameter);
$a['sss'] = function(){ echo 'bla'; };
$a['sss']();

class Bla
{
    private $a;
    function test()
    {
        $this->a['sss'] = function(){ echo 'bla2'; };
        $this->a['sss']();
    }
}
$c = new Bla();
$c->test();