摘要:匿名函數(Anonymous functions),也叫閉包函數(closures),允許 臨時創建一個沒有指定名稱的函數。最經常用作回調函數(callback)參數的值。當然,也有其它應用的情況。子函數可以使用父函數的局部變量,這種行為叫做閉包...
匿名函數(Anonymous functions),也叫閉包函數(closures),允許 臨時創建一個沒有指定名稱的函數。最經常用作回調函數(callback)參數的值。當然,也有其它應用的情況。
通俗的說:子函數可以使用父函數的局部變量,這種行為叫做閉包.
PHP版本要求:PHP5.3+
閉包是由匿名函數實現的,所以先聲明一個匿名函數:
// 匿名函數因為沒有名字,如果使用它,必須將其返回一個變量 $var = function ($value){ echo $value; }; //一定要加分號結束 $var('test'); // 運行結果: test var_dump($var); // $var它是Closure類的一個對象實例 // $var變量名后面有(),實際調用__invoke()方法
如果我們要使用這個匿名函數之外的變量,如以下代碼,我們要使用use語言結構:
function demo(){ $a = 10; $b = 20; $var = function($value) use ($a, $b) { echo $value.' and '.$a.' and '.$b; }; $var('hello'); } demo(); //運行結果: hello and 10 and 20
在匿名函數中改變外部變量(父函數變量)的值:
function demo(){ $a = 10; $b = 20; // use 引用的變量是 $a,$b 的副本,如果要完全引用,就要加上 & 符號。 $var = function($value) use (&$a, &$b) { echo $value.' and '.$a.' and '.$b; $a ++; $b ++; }; $var('hello'); echo '<br>'; echo $a.'<br>'; echo $b.'<br>'; } demo(); // 運行結果: // hello and 10 and 20 // 11 // 21
將匿名函數返回,實現一個真正的閉包:
function demo(){ $a = 10; // 將匿名函數返回 return function($value) use (&$a) { echo $value.'<br>'; $a ++; echo $a.'<br><br>'; }; } $var = demo(); // 閉包函數返回時,該函數的內部變量處于激活狀態,函數所在棧區依然保留 $var('hello'); $var('test'); $var('value'); // 運行結果: // hello // 11 // test // 12 // value // 13
閉包的應用場景:
1.保護函數內的變量安全,外層函數中變量只有內部函數才能訪問,無法通過其他途徑訪問到,因此保護了外層函數中變量的安全性。
2.在內存中維持一個變量,外層函數中的變量一直存在內存中,因此每次執行,都會使用到。