欧美成人午夜免费全部完,亚洲午夜福利精品久久,а√最新版在线天堂,另类亚洲综合区图片小说区,亚洲欧美日韩精品色xxx

扣丁學(xué)堂PHP培訓(xùn)之PHP中閉包和匿名函數(shù)詳解

2018-01-23 10:10:34 1207瀏覽

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

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

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

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

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

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



//創(chuàng)建閉包

$closure=function($name){

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

}

echo$closure("jerry");

//檢測(cè)$closure變量是否是一個(gè)閉包

var_dump($closureinstanceofClosure);

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

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

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

$nubmers=array_map(function($number){

return$number++;

},[1,2,3]);

var_dump($numbers);

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

使用use關(guān)鍵字

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

functionCar($name){

returnfunction($statu)use($name){

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

}

}

//將車(chē)名封裝在閉包中

$car=Car("bmw");

//調(diào)用車(chē)的動(dòng)作

//輸出-->"bmwisrunning"

echo$car("running");

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

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

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

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

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

classTestClosure

{

private$name=[];

private$age;

private$sex;

publicfunctionaddPerson($name,$personCallback){

//將閉包對(duì)象綁定當(dāng)前實(shí)例

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

}

publicfunctiondisplay($name){

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

if($key==$name){

//執(zhí)行閉包對(duì)象,將閉包狀態(tài)附加到類(lè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ù)的詳細(xì)介紹,最后想要了解更多關(guān)于PHP開(kāi)發(fā)發(fā)展前景趨勢(shì),請(qǐng)關(guān)注扣丁學(xué)堂官網(wǎng)、微信等平臺(tái),扣丁學(xué)堂IT職業(yè)在線學(xué)習(xí)教育平臺(tái)為您提供權(quán)威的PHP培訓(xùn)視頻教程系統(tǒng),通過(guò)千鋒扣丁學(xué)堂金牌講師在線錄制的第一套自適應(yīng)PHP在線視頻課程系統(tǒng),讓你快速掌握PHP從入門(mén)到精通開(kāi)發(fā)實(shí)戰(zhàn)技能??鄱W(xué)堂PHP技術(shù)交流群:374332265。



扣丁學(xué)堂微信公眾號(hào)



關(guān)注微信公眾號(hào)獲取更多學(xué)習(xí)資料



查看更多關(guān)于“php培訓(xùn)資訊的相關(guān)文章>>

標(biāo)簽: PHP培訓(xùn) PHP視頻教程 PHP從入門(mén)到精通 PHP學(xué)習(xí)路線圖 PHP開(kāi)發(fā)工程師

熱門(mén)專(zhuān)區(qū)

暫無(wú)熱門(mén)資訊

課程推薦

微信
微博
15311698296

全國(guó)免費(fèi)咨詢(xún)熱線

郵箱:codingke@1000phone.com

官方群:148715490

北京千鋒互聯(lián)科技有限公司版權(quán)所有   北京市海淀區(qū)寶盛北里西區(qū)28號(hào)中關(guān)村智誠(chéng)科創(chuàng)大廈4層
京ICP備2021002079號(hào)-2   Copyright ? 2017 - 2022
返回頂部 返回頂部