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

时间:2013-02-16 16:40:20

标签: php arrays class anonymous-function

我正在尝试将匿名函数存储在我班级的static array属性中。稍后应通过索引调用这些函数,但调用

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

3 个答案:

答案 0 :(得分:2)

这是php解析器的行为

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

呼叫

self::hello();

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

(self::$functionName['a'])(); // doesn't work in php :(

就像你在javascript中所做的那样,例如

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

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

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

希望这会有所帮助...


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

$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)

时才起作用

答案 1 :(得分:0)

嗯,在php中你根本做不到,它是一个PHP功能。但您可以使用call_user_func或其亲属:

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

答案 2 :(得分:0)

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

正如您所发现的那样,您可以通过两个单独的陈述来解决这个问题。