2013-10-31 96 views
2

創建函數時,我已經在各種編碼示例中看到了不同的編碼風格。

是什麼VS

function provider(){ code here } 

創建使用

$provider = function() { code here } 

函數之間的區別是第一個例子簡單的短版:$data = provider();
我們什麼時候使用第一個例子?

+2

'$提供商=函數(){...}'創建一個變量名爲$提供商可以作爲參數傳遞給其他函數;但它本身也是一個可執行的功能。 –

回答

3

不,它不是。第一個代碼是closure的聲明,即匿名函數。它沒有名字,可以用保存它的標識符來調用。第二個示例是normal function(用戶定義的函數,更具體),因此它可以通過它的名稱在所有作用域內訪問,而不像閉包,只能在定義的範圍內調用。

如你願意,你可以有很多倒閉 - 它們只是調用實體,例如這是有效的:

$provider = function() { Code here } 
$another = function() { Code here } //same code 

-and呼籲$provider(例如,與call_user_func())將有無關$another

另一個顯著不同的是,封閉能接受上下文參數像:

$provider = function() use ($param1, $param2, ...) { Code here } 

-so在它的身體內上下文參數將可用。上下文參數不像通常的參數 - 因爲上下文參數定義和存在與閉包無關,而參數在此時被計算,發生呼叫時。

0

第一個聲明是匿名函數。在賦值之後,我們有名稱爲$ provider的變量,並且可以調用$ provider()。第二個聲明只是它的正常函數。 匿名功能可以是用戶例如了在array_map,array_filter.For例如

$a = array(1, 2, 3, 4, 5); 
$res = array_filter(
    $a, function ($elem) { 
     return $elem > 3; 
    } 
); 
print_r($res); 

輸出元件誰更大3