在PHP中,匿名函數(Anonymous functions),也叫閉包函數(closures),允許 臨時創建一個沒有指定名稱的函數。最經常用作回調函數(callback)參數的值。當然,也有其它應用的情況。
匿名函數目前是通過 Closure 類來實現的。(摘自官方文檔)
1、簡單示例
定義一個函數,並沒有指定名稱,再指定一個參數
1 $fun = function ($variable) { 2 echo $variable . '---'; 3 }; 4 $a = '123'; //變量$a定義在匿名函數定義前,還是后,結果是一樣的
5 $fun($a); 6 // 運行結果為: 123---
2、未使用 use
如果不使用use ,則不能在匿名函數中調用變量$b。
1 $b = '456'; 2 $fun = function ($variable) { 3 echo $variable .'---'. $b; 4 }; 5 $a = '123'; 6 $fun($a); 7 // 輸出結果為 ErrorException 未定義變量 b
3、使用use
借助關鍵字use之后,就可以調用變量$b了
1 $a = '123'; 2 $b = '456';// 此時,變量$b必須定義在匿名函數定義前
3 $fun = function ($variable) use($b) { 4 echo $variable .'---'. $b; 5 }; 6 $fun($a); 7 // 輸出結果是 123---456
前提是變量$b必須在匿名函數定義之前,否則依然會提示未定義變量 b
4、不使用&
1 $a = '123'; 2 $b = '456';// 此時,變量$b必須定義在匿名函數定義前
3 $fun = function ($variable) use($b) { 4 echo $variable .'---'. $b; 5 }; 6 $fun($a); 7 // 輸出結果是 123---456
8 $b = 5678; 9 $fun($a); 10 // 輸出結果依然是 123---456
示例4中,雖然修改了變量b的值,但是結果依然是123—456,因為匿名函數在定義時已經保存了變量b的值,這也是證明了為何$b必須定義在匿名函數定義之前的原因了,因為在定義時,會保存這個值,如果要想隨着外界修改而自動更新,則就使用引用傳遞了,即&
5、使用&
1 $a = '123'; 2 $b = '456'; 3 $fun = function ($variable) use(&$b) { 4 echo $variable .'---'. $b; 5 }; 6 $fun($a); 7 // 輸出結果是 123---456
8 $b = 5678; 9 $fun($a); 10 // 輸出結果變為 123---5678
備注:以上調試php版本是7.3.4
