亚洲天堂色av_香蕉黄色一级片_蜜臀av网站_国产足控福利视频一区_久久av伊人_av网址在线

18842388900

網(wǎng)站建設(shè) APP開發(fā) 小程序

Article/文章

記錄成長(zhǎng)點(diǎn)滴 分享您我感悟

您當(dāng)前位置>首頁(yè) > 知識(shí) > 網(wǎng)站建設(shè)

PHP5.3閉包功能和應(yīng)用程序詳細(xì)信息

在我們開始之前,這個(gè)例子只是為了澄清觀點(diǎn),而不考慮其他因素,如性能。

“貨比三家”

從一個(gè)帶有以下數(shù)組的簡(jiǎn)單示例開始:

$ nums=array(10,20,30,40);

您需要在數(shù)組中查找大于15的項(xiàng)目。因此,在不考慮結(jié)束的情況下,我們可以寫下這個(gè):

$解析度=陣列(); foreach($ numsas $ n){if($ n> 15){$ res []=$ n; }

如果語(yǔ)言本身具有閉包支持,那么它可能是這樣寫的(Groovy語(yǔ)言)

Def res=nums.findAll {it> 15}或使用Scala語(yǔ)言

Val res=nums過(guò)濾器(_> 15)注釋:Javascript 1.6將如下

Var res=nums.filter(function(c){return c> 15});

因?yàn)檠h(huán)操作已被抽象化,所以你可以看到Groovy,Scala(和Javascript)非常漂亮,可以在一行中完成。

當(dāng)然,如果你使用PHP5.3閉包,你可以這樣做

$ res=array_filter($ nums,function($ v){return $ v> 15;});

在這方面,PHP使用比Scala更多的字符,但與前面的示例相比,它更短更好閱讀。

順便說(shuō)一下,上面的PHP代碼實(shí)際上使用了Lambda解析,而不是真正的閉包,這不是我們當(dāng)前關(guān)注的焦點(diǎn)。有關(guān)PHP閉包和Lambda解析的詳細(xì)信息,請(qǐng)參見此處。

目前似乎感覺(jué)還不錯(cuò),那么我們?cè)谥黝}上添加了更多的難度:找到大于15的所有項(xiàng)目,然后乘以2并在范圍中添加變量值以返回。

Groovy實(shí)現(xiàn):

Defx=1def res=nums.findAll {it> 15} .collect {it * 2 + x}

Scala的實(shí)施:

Valx=1valres=numsfilter(_> 15)map(_ * 2 + x)

PHP實(shí)現(xiàn):

$ X=1; $ res=array_map(函數(shù)($ v)使用($ x){return $ v * 2 + $ x;},array_filter($ nums,function($ v){return $ v> 15;}));

就代碼大小而言,現(xiàn)在看來(lái)PHP與其他語(yǔ)言不同。拋開代碼本身的美學(xué),上面的PHP代碼還有一個(gè)問(wèn)題。

例如,如果您需要使用數(shù)組鍵而不是值進(jìn)行比較,該怎么辦?是的,上面的代碼不起作用。同時(shí),從語(yǔ)法的角度來(lái)看,上述代碼很難閱讀。

回到真相,那么你仍然需要回到舊的想法來(lái)解決問(wèn)題:

$ X=1; $解析度=陣列(); foreach($ numsas $ n){if($ n> 15){$ res []=$ n * 2 + $ x; }

這似乎很清楚。但此時(shí)你可能會(huì)再次感到困惑:“那仍然是一個(gè)折騰,不是陣列操作嗎?”。

是的,好戲仍然落后。這一次是時(shí)候讓PHP的一些高級(jí)功能出來(lái),以獲得似乎有自我傷害傾向的“無(wú)聊問(wèn)題”。

ArrayObject – 對(duì)數(shù)組的封裝

PHP有一個(gè)名為SPL的標(biāo)準(zhǔn)庫(kù),它包含一個(gè)名為ArrayObject的類,它提供“類數(shù)組類”的功能,例如

$解析度=newArrayObject(陣列(10,20,30,40)); foreach($ resas $ v){echo'$ vn'; }

ArrayObject是一個(gè)內(nèi)置類,因此您可以像其他類操作一樣包裝它。

Arr - 包上糖衣

現(xiàn)在我們有了ArrayObject和閉包,我們可以開始嘗試封裝它:

classArrextendsArrayObject {staticfunctionmake($ array){returnnewself($ array); functionmap($ func){$ res=newself(); foreach($ thisas $ k=> $ v){$ res [$ k]=$ func($ k,$ v); } return $ res;} functionfilter($ func){$ res=newself(); foreach($ thisas $ k=> $ v){if($ func($ k,$ v)){$ res [$ k]=$ v;返回$ res; }

好的,一切都準(zhǔn)備好了。下面重寫的PHP代碼將解決上面提到的問(wèn)題,似乎語(yǔ)法“不多”:

$ res=Arr: make($ nums) - > filter(函數(shù)($ k,$ v){return $ v> 15;}) - > map(函數(shù)($ k,$ v){return $ v * 2;});

上述代碼與傳統(tǒng)方式有何不同?首先,他們可以遞歸并形成鏈?zhǔn)秸{(diào)用,因此您可以添加更多類似的操作。

同時(shí),您可以通過(guò)回調(diào)的兩個(gè)參數(shù)來(lái)操縱數(shù)組的鍵和項(xiàng)的值 - $ k對(duì)應(yīng)的鍵和$ v對(duì)應(yīng)的值。這允許我們?cè)陂]包中使用鍵值,而傳統(tǒng)的PHP函數(shù)array_fliter是不可能的。

另一個(gè)好處是更一致的API調(diào)用。使用傳統(tǒng)的PHP函數(shù)操作,第一個(gè)參數(shù)可能是閉包,數(shù)組或多個(gè)數(shù)組.誰(shuí)知道呢?

這是Arr類的完整源代碼,它包含其他有用的函數(shù)(如reduce和walk),但它們的實(shí)現(xiàn)類似于代碼。

博弈

這個(gè)問(wèn)題實(shí)際上很難回答 - 這取決于許多因素,例如代碼的上下文和程序員本身。事實(shí)上,當(dāng)我第一次看到PHP閉包實(shí)現(xiàn)時(shí),我覺(jué)得我很久以前就回到了Java時(shí)期,當(dāng)時(shí)我開始使用匿名內(nèi)置類來(lái)實(shí)現(xiàn)閉包。當(dāng)然,盡管可以這樣做,但它似乎是一個(gè)多余的補(bǔ)充。 PHP閉包本身是正確的,但它的實(shí)現(xiàn)和語(yǔ)法讓我很困惑。

其他具有閉包功能的語(yǔ)言,可以通過(guò)優(yōu)雅的語(yǔ)法輕松調(diào)用閉包。在上面的例子中,在Scala中使用傳統(tǒng)循環(huán)可以工作,但你會(huì)這樣寫嗎?另一方面,有人說(shuō)上面的主題可以使用PHP閉包來(lái)實(shí)現(xiàn),但一般來(lái)說(shuō)你會(huì)這樣寫嗎?

可以確定PHP閉包在某些情況下可能變成尖銳的軍刀(例如延遲執(zhí)行和資源調(diào)用),但在傳統(tǒng)的迭代和數(shù)組操作中有點(diǎn)困難。不要?dú)怵H,無(wú)論如何,編寫兼容,干凈的代碼和API都很重要。

網(wǎng)站建設(shè),小程序開發(fā),小程序制作,微信小程序開發(fā),公眾號(hào)開發(fā),微信公眾號(hào)開發(fā),網(wǎng)頁(yè)設(shè)計(jì),網(wǎng)站優(yōu)化,網(wǎng)站排名,網(wǎng)站設(shè)計(jì),微信小程序設(shè)計(jì),小程序定制,微信小程序定制

相關(guān)案例查看更多

主站蜘蛛池模板: 天美传媒免费看 | chine老太交80years | av日日夜夜| 久久久午夜剧场 | 日本不卡在线 | 日本在线不卡一区二区 | 韩国女主播福利视频 | 中文字幕不卡一区二区三区 | gay网址| 日韩免费成人av | 国产精品久久久久久久久久免费看 | 全黄性色大片 | 久久精品国产亚洲AV嫖农村妇女 | 久久爽av亚洲精品天堂 | 亚洲人成人无码www影院 | 一道本av | 粉色视频入口在线网站 | 国产精品久久久久久久美女直播 | 久久精品中文字幕免费mv | 中国老熟妇XXXXX | 新版红楼梦在线高清免费观看 | 涩涩导航 | 国产一区二区日韩精品 | 成人H动漫精品一区二区无码 | 国产丰满老熟妇乱xxx1区 | 大片网站免费观看 | chinese真实伦对白露脸 | 羞羞答答成人影院www | 精品午夜久久 | 中文无码精品a∨在线 | 国产黄色小视频网站 | 91 亚洲一区| 色偷偷偷在线视频播放 | 成人精品一区二区三区电影黑人 | 2019中文字幕全在线观看 | 国产成人亚洲欧 | 国产超碰人人做人人爱ⅤA 久久国产精品99精国产 | 日本囗交全过程无遮挡 | а√中文在线8 | 国产一区二区中文字幕 | 大地资源网在线观看免费 |