【发布时间】:2015-02-01 13:48:27
【问题描述】:
我想调用一个匿名函数而不为它声明一个变量。
我知道这是一个可行的示例:
$foo = function ($bar) use ($foo) {
if (is_array($bar)) {
foreach ($bar AS $current) {
$foo($current);
}
}
else {
print($bar);
}
};
$foo($input);
# Unset variable cause we won't need it anymore
# and we like to have a lot of free memory.
unset($foo);
但我想自动调用并取消设置:
call_user_func(function ($bar) {
if (is_array($bar)) {
foreach ($bar AS $current) {
# This won't work
# as our function doesn't have any name.
call_user_func(__FUNCTION__, $current);
}
}
else {
print($bar);
}
}, $input);
但是这个例子是行不通的,因为我们的函数没有名字。有什么解决方法或者你知道解决这个问题的方法吗?
PS:假设$input 是以下数组:["Hello, ", "World!"]。
至此,输出应该是:
Hello,
World!
更新 #1:
由于这只是一个示例,call_user_func_array(function () { ... }, $input) 不是我正在寻找的解决方案。
如果我有一个像 [["Hello, ", "World"], "!"] 这样的 $input,它将无法工作。
更新 #2:
我不寻找的另一个解决方案是debug_backtrace()[1]['args'][0]->__invoke($current);。我认为仅用于 debug 已经够丑了。 :)
感谢@fschmengler。
另外一种形式是call_user_func(debug_backtrace()[1]['args'][0], $current));。
更新 #3:
@UlrichEckhardt 编写的另一个解决方案是将匿名函数嵌入到另一个匿名函数中。我认为,取消设置先前声明的函数变量 - 例如。第一个例子 - 既干净又短。但这也是一个解决方案。
function () {
$f = function ($param) use ($f) {
// use $f here
}
return $f;
}()
【问题讨论】:
-
@MichaelBerkowski
(function() {...})();解决方案会很有趣,但目前还不是实际的。也许唯一可用的解决方案是为 PHP 5.5 - 5.6 制作call_user_anonym_func()。 (?) -
@MichaelBerkowski 第一个例子是一个有效的例子,它确实如此。但我不想为函数声明一个变量并将其存储在其中(或者
unset(),如果它完成了。(这真的没有意义,但我认为这是一个有趣的问题。) -
对不起,对不起。当我去搜索相关问题时,我忘记了你说最上面的例子有效。我将删除之前的 cmets。
-
@MichaelBerkowski 没问题! :D
-
在重新发明轮子之前,你检查过
array_walk_recursive()吗?它迭代嵌套数组树并在每个叶子(!)元素上调用一个函数。
标签: php recursion anonymous-function php-5.5