我正在尝试将匿名函数存储在我班级的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
答案 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
的变量)。
正如您所发现的那样,您可以通过两个单独的陈述来解决这个问题。