例如:
$functions = array(
'function1' => function($echo) { echo $echo; }
);
这可能吗?最好的选择是什么?
Answers:
推荐的方法是使用匿名函数:
$functions = [
'function1' => function ($echo) {
echo $echo;
}
];
如果要存储已经声明的函数,则可以简单地通过名称将其引用为字符串:
function do_echo($echo) {
echo $echo;
}
$functions = [
'function1' => 'do_echo'
];
在PHP的旧版本(<5.3)中,不支持匿名函数,您可能需要诉诸使用 create_function
(自PHP 7.2起已弃用):
$functions = array(
'function1' => create_function('$echo', 'echo $echo;')
);
所有这些方法都在callable
伪类型的文档中列出。
无论您选择哪种方法,都可以直接调用该函数(PHP≥5.4)或使用call_user_func
/ call_user_func_array
:
$functions['function1']('Hello world!');
call_user_func($functions['function1'], 'Hello world!');
$functions["functions1"]
包含一个可调用项,将其分配给也$var
将导致$var
包含一个可调用项。您仍然需要调用with$var()
来获取返回值。
从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"])
参考资料:
因为我可以
扩展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());
}
可用于重载任何函数,而不仅仅是构造函数。
<?php
$_['nice']=function(){
echo 'emulate a class';
};
$_['how']=function(){
echo ' Now you can ';
};
(function()use($_){//autorun
echo 'construct:';
($_['how'])();
($_['nice'])();
})();
//almost the same in here. i do not recomand each of them
//using array of functions or classes isn't a very high speed execution script
//when you build 70k minimum app
//IF YOU USE THESE ONLY TO TRIGGER SMALL THINGS OVER A FRAMEWORK THAT IS A GO
[
(function(){
echo 'construct 2:Now you can ';
return '';
})()
,(function(){
echo 'emulate a class';
return '';
})()
];
?>
$functions = [ 'function1' => function($echo){ echo $echo; } ];
......自PHP 5.3起提供匿名函数,自5.4起,您可以编写[]
而不是array()