我想将匿名函数存储在类中的数组中。以下是我的工作代码。但是我不明白为什么我必须在第二个参数中传入值,而我已经声明它是一个空数组,如果没有从外部设置的话。
- public function methods($method = "init",$options = array()){
-
有什么想法吗?
class myclass {
public function __construct() {}
public function methods($method = "init",$options = array()){
$methods = array(
"init" => function($options){
return $options;
},
"run" => function($options){
return $options;
},
);
return call_user_func_array( $methods[$method], $options);
}
}
$obj = new myclass();
var_dump($obj->methods("init",array("hello world!"))); // string 'hello world!' (length=12) --> correct.
var_dump($obj->methods("init",array())); // Warning: Missing argument 1 for myclass::{closure}() in...refer to -> "init" => function($options){
var_dump($obj->methods("init")); // Warning: Missing argument 1 for myclass::{closure}() in...refer to -> "init" => function($options){
我认为它应该将这些作为结果返回,
var_dump($obj->methods("init",array())); // array (size=0) empty
var_dump($obj->methods("init")); // array (size=0) empty
答案 0 :(得分:4)
您案件的正确结束声明是:
$methods = array(
"init" => function() use ($options){
return $options;
},
"run" => function() use ($options){
return $options;
},
);
如果在闭包声明中包含$options
变量,则其范围将是闭包本身。因此,将创建一个 new $options
变量,并覆盖外部函数中的$options
变量。
通过使用use
关键字,告诉PHP您要使用传递的$options
变量(当前已启动)。
现在,您可以省略call_user_func_array
调用中的第二个参数,如下所示
call_user_func_array($methods[$method])