博客專欄

EEPW首頁 > 博客 > PHP中閉包和匿名函數(shù)分享

PHP中閉包和匿名函數(shù)分享

發(fā)布人:only1 時間:2020-09-29 來源:工程師 發(fā)布文章

今天扣丁學(xué)堂給大家介紹的是關(guān)于PHP中的閉包和匿名函數(shù),以及閉包的作用,希望對同學(xué)們學(xué)習(xí)有所幫助,下面我們一起來看一下吧。

  

PHP支持回調(diào)函數(shù)(callback)和其他高級語言相比是增分比較多的一項功能。但是和JavaScript相比,php5.3以前的回調(diào)函數(shù)使用并不是很靈活的,只有字符串的函數(shù)名和使用create_function的返回值兩種選擇。而在php5.3以后,我們又多了一個選擇--匿名函數(shù)(Anonymousfunction),也叫閉包函數(shù)(closures),它允許臨時創(chuàng)建一個沒有指定名稱的函數(shù),常用作回調(diào)函數(shù)參數(shù)的值。  

閉包是指在創(chuàng)建時封裝周圍狀態(tài)的函數(shù)。即使閉包所在的環(huán)境不存在了,閉包中封裝的狀態(tài)依然存在。  

匿名函數(shù)就是沒有名稱的函數(shù)。匿名函數(shù)可以賦值給變量,還能像其他任何PHP對象那樣傳遞。不過匿名函數(shù)仍是函數(shù),因此可以調(diào)用,還可以傳入?yún)?shù)。匿名函數(shù)特別適合作為函數(shù)或方法的回調(diào)。  

注意:理論上講,閉包和匿名函數(shù)是不同的概念。不過,PHP將其視作相同的概念。所以,我們提到閉包時,指的也是匿名函數(shù),反之亦然。  

PHP閉包和匿名函數(shù)使用的句法與普通函數(shù)相同,但閉包和匿名函數(shù)其實是偽裝成函數(shù)的對象(Closure類的實例)。  

//創(chuàng)建閉包  

$closure=function($name){  

returnsprintf("Hello%s",$name);  

}  

echo$closure("jerry");  

//檢測$closure變量是否是一個閉包  

var_dump($closureinstanceofClosure);  

以上代碼創(chuàng)建了一個閉包對象,然后將其賦值給$closure變量。閉包和普通的PHP函數(shù)很像,使用的句法相同,也接收參數(shù),而且能返回值。  

說明:我們之所以能夠調(diào)用$closure變量,是因為這個變量的值是一個閉包,而且閉包對象實現(xiàn)了__invoke()魔術(shù)方法。只要變量名后有(),PHP就會查找并調(diào)用__invoke()方法。  

使用閉包我們通常把PHP閉包當做當做函數(shù)和方法的回調(diào)使用。很多PHP函數(shù)都會用到回調(diào)函數(shù),例如array_map()和preg_replace_callback().如下示例,我們將用array_map()處理數(shù)組,將數(shù)組每一項自增1:  

$nubmers=array_map(function($number){  

return$number++;  

},[1,2,3]);  

var_dump($numbers);  

附加狀態(tài)PHP閉包不會像真正的javascrypt閉包那樣自動封裝應(yīng)用的狀態(tài),我們必須手動調(diào)用閉包對象的bindTo()方法或者使用use關(guān)鍵字,把狀態(tài)附加到PHP閉包上。  

使用use關(guān)鍵字  

使用use關(guān)鍵字來附加閉包狀態(tài)更加常見,因此我們先來看這種方式。使用use關(guān)鍵字把變量附加閉包上時,附加的變量會記住附加時賦給它的值。  

functionCar($name){  

returnfunction($statu)use($name){  

returnsprintf("Car%sis%s",$name,$statu);  

}  

}  

//將車名封裝在閉包中  

$car=Car("bmw");  

//調(diào)用車的動作  

//輸出-->"bmwisrunning"  

echo$car("running");  

注意:使用use關(guān)鍵字可以把多個參數(shù)傳入閉包,此時要像PHP函數(shù)或方法的參數(shù)一樣,使用逗號分隔多個參數(shù)。  

使用bindTo()方法附加閉包的狀態(tài)  

與其它PHP對象類似,每個閉包實例都可以使用$this關(guān)鍵字獲取閉包的內(nèi)部狀態(tài)。閉包對象的默認狀態(tài)沒什么用,不過有一個__invoke()魔術(shù)方法和bindTo()方法。  

bindTo()方法為閉包增加了一些有趣的潛力。我們可以使用這個方法把Closure對象的內(nèi)部狀態(tài)綁定到其它對象上。  

bindTo()方法的第二個參數(shù)很重要,其作用是指定綁定閉包的那個對象所屬的PHP類。因此,閉包可以訪問綁定閉包的對象中受保護和私有的成員變量。  

classTestClosure  

{  

private$name=[];  

private$age;  

private$sex;  

publicfunctionaddPerson($name,$personCallback){  

//將閉包對象綁定當前實例  

$this->name[$name]=$personCallback->bindTo($this,__CLASS__);  

}  

publicfunctiondisplay($name){  

foreach($this->nameas$key=>$callback){  

if($key==$name){  

//執(zhí)行閉包對象,將閉包狀態(tài)附加到類  

$callback();  

}  

}  

echo"name:{$name}\n";  

echo"age:{$this->age}\n";  

echo"sex:{$this->sex}\n";  

}  

}  

$person=newTestClosure();  

$person->addPerson("jerry",function(){  

$this->age=19;  

$this->sex="man";  

});  

$person->display("jerry");  

/**output  

name:jerry  

age:19  

sex:man  

*/  

以上就是關(guān)于扣丁學(xué)堂PHP視頻教程之PHP中閉包和匿名函數(shù)的詳細介紹,最后想要了解更多關(guān)于PHP開發(fā)發(fā)展前景趨勢,請關(guān)注扣丁學(xué)堂官網(wǎng)、微信等平臺,扣丁學(xué)堂IT職業(yè)在線學(xué)習(xí)教育平臺為您提供權(quán)威的PHP培訓(xùn)視頻教程系統(tǒng),通過千鋒扣丁學(xué)堂金牌講師在線錄制的第一套自適應(yīng)PHP在線視頻課程系統(tǒng),讓你快速掌握PHP從入門到精通開發(fā)實戰(zhàn)技能??鄱W(xué)堂PHP技術(shù)交流群:374332265。

*博客內(nèi)容為網(wǎng)友個人發(fā)布,僅代表博主個人觀點,如有侵權(quán)請聯(lián)系工作人員刪除。



關(guān)鍵詞:

相關(guān)推薦

技術(shù)專區(qū)

關(guān)閉