你能在PHP数组中存储一个函数吗?

Kir*_*met 62 php arrays function

例如:

$functions = array(
  'function1' => function($echo) { echo $echo; }
);
Run Code Online (Sandbox Code Playgroud)

这可能吗?什么是最好的选择?

Ale*_*ett 140

有几个选择.用途create_function:

$functions = array(
  'function1' => create_function('$echo', 'echo $echo;')
);
Run Code Online (Sandbox Code Playgroud)

只需将函数的名称存储为字符串(这实际上create_function就是这一切):

function do_echo($echo) {
    echo $echo;
}

$functions = array(
  'function1' => 'do_echo'
);
Run Code Online (Sandbox Code Playgroud)

如果您使用的是PHP 5.3,则可以使用匿名函数:

$functions = array(
  'function1' => function($echo) {
        echo $echo;
   }
);
Run Code Online (Sandbox Code Playgroud)

所有这些方法都列在callback伪类型下的文档中.无论您选择哪种方式,调用函数的推荐方法都是使用call_user_funccall_user_func_array函数.

call_user_func($functions['function1'], 'Hello world!');
Run Code Online (Sandbox Code Playgroud)

  • 来自[php.net](http://php.net/manual/en/function.create-function.php)**`警告此功能自PHP 7.2.0起已废弃.非常不鼓励依赖此功能.** (3认同)
  • 嗨@罗伊。由于 `$functions["functions1"]` 包含一个可调用对象,将其分配给 `$var` 将导致 `$var` 也包含一个可调用对象。你仍然需要用 `$var()` 调用它来获取返回值。 (2认同)
  • 刚发现一个小错误,如果数组是类成员,PHP 5.3方法不起作用,如:class MyClass {$ functions = ['function1'=> function($ echo){echo $ echo; }]; } (2认同)

jav*_*web 10

由于PHP"5.3.0匿名函数变得可用",使用示例:

请注意,这比使用旧版要快得多create_function...

//store anonymous function in an array variable e.g. $a["my_func"]
$a = array(
    "my_func" => function($param = "no parameter"){ 
        echo "In my function. Parameter: ".$param;
    }
);

//check if there is some function or method
if( is_callable( $a["my_func"] ) ) $a["my_func"](); 
    else echo "is not callable";
// OUTPUTS: "In my function. Parameter: no parameter"

echo "\n<br>"; //new line

if( is_callable( $a["my_func"] ) ) $a["my_func"]("Hi friend!"); 
    else echo "is not callable";
// OUTPUTS: "In my function. Parameter: Hi friend!"

echo "\n<br>"; //new line

if( is_callable( $a["somethingElse"] ) ) $a["somethingElse"]("Something else!"); 
    else echo "is not callable";
// OUTPUTS: "is not callable",(there is no function/method stored in $a["somethingElse"])
Run Code Online (Sandbox Code Playgroud)

参考文献:


Rib*_*die 9

要跟进Alex Barrett的帖子,create_function()会返回一个实际可用于调用函数的值,因此:

$function = create_function('$echo', 'echo $echo;' );
$function('hello world');
Run Code Online (Sandbox Code Playgroud)