1

I'm trying to store anonymous functions in a static array property of my class. These functions should be invoked later by their index, but calling

self::$arr['index']()

just doesn't work, while

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

does!

This doesn't work:

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"

But this does:

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"

Why?

I'm using PHP Version 5.4.3

4

3 回答 3

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:: 等)时才有效

于 2013-02-16T17:08:55.903 回答
0

这是 PHP 解析器当前工作方式的结果。由于函数调用()是在 static operator 之前评估的::,因此您最终会导致解析器尝试引用局部变量$func,然后给出有关 $func 未定义的错误(确实如此,因为$func方法中没有命名变量)。

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

于 2013-02-16T17:21:46.253 回答
0

好吧,在 php 中你根本无法做到这一点,它是 php 的一个特性。但是您可以使用call_user_func或其亲属:

return call_user_func(self::$func['$a'], $str);
于 2013-02-16T17:04:42.930 回答