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