php 閉包(closure)的使用
阿新 • • 發佈:2020-07-22
---(遷移自本人2015-08-1410:36:06 日的新浪部落格日誌)
以前寫的一堆東西放在部落格格式也不對,現在全部遷移過來。
php的閉包或許我從來沒去注意過,php還有這個用法。網際網路在不斷的更新,我們也要跟上自己的腳步,雖然說對你寫程式是不是幫助特別大,或者用得多不多,這些都不必要去考慮,至少它存在了,我們要知道就可以了,至於你用或者不用,在於你了。
自上回因空餘時間看了看python語言(),其中講到了閉包的概念,python定義萬物歸一,一切皆物件的概念。 那麼函式也是一個物件,所以可以作為某個函式的返回結果。想想這個閉包也是那麼回事呀, 突然想想那php有沒有閉包呢,後來一查詢還真的有。程式設計的概念都是統一的,這就是計算機語言之間的想通之處呀! 那麼php的閉包是怎麼一回事呢?那我們來說說吧 php的閉包(closure)也就是匿名函式,php5.3引入的。說起匿名函式,好像還是比較耳熟的,這就來了興趣了。 php匿名函式的語法很簡單,$a看到以上程式碼,你應該就能理解為何叫匿名函數了吧,宣告一個沒有名字的函式。如果想使用它,需要將其返回給一個$a變數。 匿名函式也可以像普通函式一樣,宣告引數, 呼叫方法也相同:= function(){ }; //帶結束符號
$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++ 然後匿名函式會儲存這些 ++之後的值,下次呼叫的時候, 就會使用儲存的這些值來輸出,而匿名函式外面卻得不到這些值,這就是閉包的概念了。 現在終於可以理解了吧!