您可以将函数存储在 PHP 数组中吗?
Posted
技术标签:
【中文标题】您可以将函数存储在 PHP 数组中吗?【英文标题】:Can you store a function in a PHP array? 【发布时间】:2010-12-02 18:15:04 【问题描述】:例如:
$functions = array(
'function1' => function($echo) echo $echo;
);
这可能吗?最好的选择是什么?
【问题讨论】:
TL;DR - 自 php 5.4 起:$functions = [ 'function1' => function($echo) echo $echo; ];
......因为 PHP 5.3 匿名函数可用,从 5.4 起你可以写 []
而不是array()
【参考方案1】:
推荐的方法是使用anonymous function:
$functions = [
'function1' => function ($echo)
echo $echo;
];
如果你想存储一个已经被声明的函数,那么你可以简单地通过名字来引用它作为一个字符串:
function do_echo($echo)
echo $echo;
$functions = [
'function1' => 'do_echo'
];
在旧版本的 PHP (create_function
(自 PHP 7.2 起已弃用):
$functions = array(
'function1' => create_function('$echo', 'echo $echo;')
);
所有这些方法都列在callable
pseudo-type 下的文档中。
无论您选择哪个,该函数都可以直接调用(PHP ≥5.4)或使用call_user_func
/call_user_func_array
:
$functions['function1']('Hello world!');
call_user_func($functions['function1'], 'Hello world!');
【讨论】:
关于call_user_func:是$var = $functions["function1"],当function1返回值时,不好的做法? 嗨@Roy。由于$functions["functions1"]
包含一个可调用对象,将其分配给$var
将导致$var
也包含一个可调用对象。您仍然需要使用 $var()
调用它以获取返回值。
刚刚发现一个小bug,如果数组是类成员,PHP 5.3 方法不起作用,例如:class MyClass $functions = [ 'function1' => function($echo) 回声$回声; ];
@ZackMorris 评论应该在答案中指出,因为在课堂上这样做并不是一个不合理的想法(在找到他的评论之前,我至少发生了两次)
来自php.net Warning This function has been DEPRECATED as of PHP 7.2.0. Relying on this function is highly discouraged.
【参考方案2】:
由于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"])
参考:
匿名函数: http://cz1.php.net/manual/en/functions.anonymous.php
测试可调用:http://cz2.php.net/is_callable
【讨论】:
【参考方案3】:警告
create_function()
自 PHP 7.2.0 起已弃用。强烈建议不要依赖此函数。
为了跟进 Alex Barrett 的帖子,create_function() 返回一个您可以实际用于调用函数的值,因此:
$function = create_function('$echo', 'echo $echo;' );
$function('hello world');
【讨论】:
【参考方案4】:因为我可以...
扩展 Alex Barrett 的帖子。
我将进一步完善这个想法,甚至可能是外部静态类,可能使用“...”标记来允许可变长度参数。
在以下示例中,为了清楚起见,我使用了关键字“数组”,但方括号也可以。所示布局使用了一个 init 函数,旨在展示更复杂代码的组织结构。
<?php
// works as per php 7.0.33
class pet
private $constructors;
function __construct()
$args = func_get_args();
$index = func_num_args()-1;
$this->init();
// Alex Barrett's suggested solution
// call_user_func($this->constructors[$index], $args);
// RibaldEddie's way works also
$this->constructors[$index]($args);
function init()
$this->constructors = array(
function($args) $this->__construct1($args[0]); ,
function($args) $this->__construct2($args[0], $args[1]);
);
function __construct1($animal)
echo 'Here is your new ' . $animal . '<br />';
function __construct2($firstName, $lastName)
echo 'Name-<br />';
echo 'First: ' . $firstName . '<br />';
echo 'Last: ' . $lastName;
$t = new pet('Cat');
echo '<br />';
$d = new pet('Oscar', 'Wilding');
?>
好的,现在精简为一行...
function __construct()
$this->'__construct' . (func_num_args()-1)(...func_get_args());
可用于重载任何函数,而不仅仅是构造函数。
【讨论】:
【参考方案5】:通过使用闭包,我们可以将函数存储在数组中。基本上,闭包是一个可以在没有指定名称的情况下创建的函数 - 一个匿名函数。
$a = 'function';
$array=array(
"a"=> call_user_func(function() use ($a)
return $a;
)
);
var_dump($array);
【讨论】:
以上是关于您可以将函数存储在 PHP 数组中吗?的主要内容,如果未能解决你的问题,请参考以下文章