簡體   English   中英

自動調用匿名函數而不聲明為變量

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM