2010-11-16 81 views
10

是否可以將匿名函數作爲參數傳遞並立即執行,從而傳遞函數的return值?PHP:傳遞匿名函數作爲參數

function myFunction(Array $data){ 
    print_r($data); 
} 

myFunction(function(){ 
    $data = array(
     'fruit'  => 'apple', 
     'vegetable' => 'broccoli', 
     'other'  => 'canned soup'); 
    return $data; 
}); 

這會引發錯誤由於Array型提示,抱怨的目的被傳遞。好的,如果我刪除了類型提示,它當然會吐出Closure Object,而不是我想要的結果。我知道我在技術上將Closure的對象實例傳遞給myFunction,但是,我已經確定我已經在其他地方看到了這一點。這可能嗎?如果是這樣,我做錯了什麼?

爲了這個討論,我不能修改我通過閉包的函數。

tl; dr:我如何傳遞一個匿名函數聲明作爲參數,導致返回值作爲參數傳遞。

PS:如果不明確,期望的輸出是:

Array 
(
    [fruit] => apple 
    [vegetable] => broccoli 
    [other] => canned soup 
) 
+0

你可能已經看到了這一點在JavaScript作爲'(函數(){})()',但PHP的功能沒有那麼靈活。 – deceze 2010-11-16 21:50:25

回答

9

你不能。你必須先打電話給他。而且,由於PHP不支持關閉取消引用的是,你必須先將其存儲在一個變量:

$f = function(){ 
    $data = array(
     'fruit'  => 'apple', 
     'vegetable' => 'broccoli', 
     'other'  => 'canned soup'); 
    return $data; 
}; 
myfunction($f()); 
+0

謝謝* ircmaxell *;該死的,我想關閉通過我所看到的參數被稱爲在他們被傳遞給函數的主體中的某個點。太糟糕了。 – Dan 2010-11-16 22:10:14

+7

幾年後...... [可能](http://php.net/manual/en/functions.anonymous.php) – Alex 2015-08-05 05:21:15

4

你傳遞函數本身,並不像你注意到的結果。你必須執行該功能會立即做這樣的事情:

myFunction((function() { 
    return ...; 
})(), $otherArgs); 

PHP不支持這樣的事情,所以你不得不說的功能分配給一些變量並執行它:

$func = function() { ... }; 
myFunction($func(), $otherArgs); 
+13

真的嗎?我們是否必須經常走這條糟糕的PHP道路(說這很糟糕,並沒有指出缺陷)呢?非常討厭......如果你認爲這很糟糕,那很好。克服它... – ircmaxell 2010-11-16 22:02:26

+0

感謝* Crozin *;我將不得不考慮其他選項。 – Dan 2010-11-16 22:10:43

7

最近,我在解決類似的問題,所以我張貼我的代碼工作正常:

$test_funkce = function ($value) 
{ 

    return ($value + 10); 
}; 


function Volej($funkce, $hodnota) 
{ 

    return $funkce->__invoke($hodnota); 
    //or alternative syntax 
    return call_user_func($funkce, $hodnota); 

} 

echo Volej($test_funkce,10); //prints 20 

希望它能幫助。首先,我創建了閉包,然後是接受閉包和參數的函數,並調用它的內部並返回它的值。簡直就夠了。

PS:回答感謝這個答案: answers

+0

太糟糕了,這個答案與其他答案相比是如此的新穎,但這絕對是幫助我解決問題的方法,謝謝! – 2015-06-19 15:33:52

+0

功能強大的PHP很少有好的資源,但實際上,當我嘗試使用閉包時,php的行爲真的很奇怪。 – 2015-06-23 13:10:11

相關問題