1. 程式人生 > 實用技巧 >php 閉包(closure)的使用

php 閉包(closure)的使用

---(遷移自本人2015-08-1410:36:06 日的新浪部落格日誌)

以前寫的一堆東西放在部落格格式也不對,現在全部遷移過來。

php的閉包或許我從來沒去注意過,php還有這個用法。網際網路在不斷的更新,我們也要跟上自己的腳步,雖然說對你寫程式是不是幫助特別大,或者用得多不多,這些都不必要去考慮,至少它存在了,我們要知道就可以了,至於你用或者不用,在於你了。

自上回因空餘時間看了看python語言(),其中講到了閉包的概念,python定義萬物歸一,一切皆物件的概念。 那麼函式也是一個物件,所以可以作為某個函式的返回結果。想想這個閉包也是那麼回事呀, 突然想想那php有沒有閉包呢,後來一查詢還真的有。程式設計的概念都是統一的,這就是計算機語言之間的想通之處呀! 那麼php的閉包是怎麼一回事呢?那我們來說說吧 php的閉包(closure)也就是匿名函式,php5.3引入的。說起匿名函式,好像還是比較耳熟的,這就來了興趣了。 php匿名函式的語法很簡單,
 
$a
= function(){ }; //帶結束符號
看到以上程式碼,你應該就能理解為何叫匿名函數了吧,宣告一個沒有名字的函式。如果想使用它,需要將其返回給一個$a變數。 匿名函式也可以像普通函式一樣,宣告引數, 呼叫方法也相同:
$a = function($param){
echo $param;
};
 
$a('some string');
輸出:
some string
在引入閉包之前,貌似這樣的使用方法並不是很好用,所以用的人也比較少。那麼怎麼實現閉包呢? 閉包就是:將匿名函式在普通函式當中當做引數傳入,也可以被返回,這樣就形成了一個簡單的閉包
//在函式裡定義一個匿名函式並且呼叫它 
function printstr(){   $a = function( $str){     echo $str;   };   $a( 'some string' ); } printstr();
也可以這樣使用
 
//在函式裡返回一個匿名函式,並且呼叫它
function printstr( ){
    $a = function( $str ){
        echo $str;
    }
    return $a;
}
$b = printstr();
$b( 'some string' );

閉包還可以使用外界變數,連線外界變數的關鍵字: use
function
printstr(){ $c = 5; $a = function ( $str ) use ( $c){ $b = $a + $c; echo $b; $c ++; } $a(4); echo $c; } printstr();

輸出:
9
4

我們可以看到使用use的$c 是可以 在匿名函式中使用用的,但是 $c的值並沒有因為在匿名函式中 $c ++ 而改變, 其實匿名函式中只是使用了$c的一個副本而已,如果想完全引用$c 呢?只需要加一個 & 符號即可
 
function printstr(){
    $c = 5;
    $a = function ( $str ) use (& $c){
        $b = $a + $c;
        echo $b;
        $c ++;
    }
    $a(4);
    echo $c;
}
printstr();

輸出:
9
5

這樣匿名函式就可以改變外界的變量了,如果將匿名函式返回給外界,匿名函式會儲存use 所引用的變數,而外界則不能得到這些變數,這樣就形成為在你面函式裡面的 ‘閉包’概念了,這樣閉包的概念就清晰可見了。
function printstr(){
    $c = 5;
    $a = function ( ) use (& $c){
        echo $c;
        $c ++;
    }
    return $a;
}
$getParam = printstr();
$getParam( );  
$getParam( );
$getParam( );
輸出:
5
6
7

可以看到外界的$c 的值還是5,但是在匿名函式裡面都每次$c++ 然後匿名函式會儲存這些 ++之後的值,下次呼叫的時候, 就會使用儲存的這些值來輸出,而匿名函式外面卻得不到這些值,這就是閉包的概念了。 現在終於可以理解了吧!