[英]Self-calling anonymous function without declaring as variable
我想調用一個匿名函數而不為它聲明一個變量。
我知道這是一個有效的例子:
$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);
。 我覺得它很難用於調試 。 :)感謝@fschmengler 。
另一種形式是call_user_func(debug_backtrace()[1]['args'][0], $current));
。
更新#3:
@UlrichEckhardt編寫的另一個解決方案是將匿名函數嵌入到另一個匿名函數中。 我認為,取消先前聲明的函數變量 - 例如。 第一個例子 - 更清潔,更短。 但這也是一個解決方案。
function () {
$f = function ($param) use ($f) {
// use $f here
}
return $f;
}()
可以使用debug_backtrace()
和。訪問閉包 使用 像以前一樣用__invoke()
來調用它 call_user_func()
調用它:
$input = ["Hello, ", "World!"];
call_user_func(function ($bar) {
if (is_array($bar)) {
foreach ($bar AS $current) {
call_user_func(debug_backtrace()[1]['args'][0], $current));
}
}
else {
print($bar);
}
}, $input);
但在我看來,將閉包賦值給變量的第一個版本更具可讀性,除了個人品味之外,我沒有看到任何反對它的論據。
更新:它必須再次是call_user_func()
,而不是__invoke()
,以便args [0]引用每個遞歸級別的閉包
寫一個閉包返回你想要的閉包並調用:
function () {
$f = function ($param) use ($f) {
// use $f here
}
return $f;
}()
我實際上不相信PHP能夠一步定義和調用函數,你可能不得不使用call_user_func()
來解決你的語言缺點。 除此之外,還有更好的方法來編寫混淆的代碼,如果令人驚訝的是不是你的目標,那么甚至可能有更清晰的替代方案。 ;-)
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.