撕开奶罩疯狂揉吮奶头_天堂69堂在线精品视频软件_亚洲中文av一区二区三区_成人无码A片一区二区三区免费看_日韩欧美亚_天天干天天操

18842388900

網站建設 APP開發 小程序

Article/文章

記錄成長點滴 分享您我感悟

您當前位置>首頁 > 知識 > 網站建設

PHP5.3閉包功能和應用程序詳細信息

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

“貨比三家”

從一個帶有以下數組的簡單示例開始:

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

您需要在數組中查找大于15的項目。因此,在不考慮結束的情況下,我們可以寫下這個:

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

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

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

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

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

因為循環操作已被抽象化,所以你可以看到Groovy,Scala(和Javascript)非常漂亮,可以在一行中完成。

當然,如果你使用PHP5.3閉包,你可以這樣做

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

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

順便說一下,上面的PHP代碼實際上使用了Lambda解析,而不是真正的閉包,這不是我們當前關注的焦點。有關PHP閉包和Lambda解析的詳細信息,請參見此處。

目前似乎感覺還不錯,那么我們在主題上添加了更多的難度:找到大于15的所有項目,然后乘以2并在范圍中添加變量值以返回。

Groovy實現:

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

Scala的實施:

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

PHP實現:

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

就代碼大小而言,現在看來PHP與其他語言不同。拋開代碼本身的美學,上面的PHP代碼還有一個問題。

例如,如果您需要使用數組鍵而不是值進行比較,該怎么辦?是的,上面的代碼不起作用。同時,從語法的角度來看,上述代碼很難閱讀。

回到真相,那么你仍然需要回到舊的想法來解決問題:

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

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

是的,好戲仍然落后。這一次是時候讓PHP的一些高級功能出來,以獲得似乎有自我傷害傾向的“無聊問題”。

ArrayObject – 對數組的封裝

PHP有一個名為SPL的標準庫,它包含一個名為ArrayObject的類,它提供“類數組類”的功能,例如

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

ArrayObject是一個內置類,因此您可以像其他類操作一樣包裝它。

Arr - 包上糖衣

現在我們有了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; }

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

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

上述代碼與傳統方式有何不同?首先,他們可以遞歸并形成鏈式調用,因此您可以添加更多類似的操作。

同時,您可以通過回調的兩個參數來操縱數組的鍵和項的值 - $ k對應的鍵和$ v對應的值。這允許我們在閉包中使用鍵值,而傳統的PHP函數array_fliter是不可能的。

另一個好處是更一致的API調用。使用傳統的PHP函數操作,第一個參數可能是閉包,數組或多個數組.誰知道呢?

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

博弈

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

其他具有閉包功能的語言,可以通過優雅的語法輕松調用閉包。在上面的例子中,在Scala中使用傳統循環可以工作,但你會這樣寫嗎?另一方面,有人說上面的主題可以使用PHP閉包來實現,但一般來說你會這樣寫嗎?

可以確定PHP閉包在某些情況下可能變成尖銳的軍刀(例如延遲執行和資源調用),但在傳統的迭代和數組操作中有點困難。不要氣餒,無論如何,編寫兼容,干凈的代碼和API都很重要。

網站建設,小程序開發,小程序制作,微信小程序開發,公眾號開發,微信公眾號開發,網頁設計,網站優化,網站排名,網站設計,微信小程序設計,小程序定制,微信小程序定制

相關案例查看更多

主站蜘蛛池模板: hsck成人网| 亚洲国产精品一区二区久久a片区 | av免费成人 | 亚洲学生妹高清av | 无码高潮少妇毛多水多水免费 | 日本高清三区 | 中国丰满大乳乳液 | 亚洲国产欧美在线看片一国产 | 精品久久久无码人妻中文字幕豆芽 | 未满成年国产在线观看 | 久久久久久噜噜噜久久久精品 | 人妻少妇精品久久久久久 | 亚洲一卡2卡3卡4卡5卡乱码观看 | 久久久亚州AV成人网站 | 91青青在线视频 | 999久久久91 免费看91的网站 | 曰本成人黄色 | 在线观看一区二区三区视频 | 麻豆精品国产精华精华液好用吗 | 自偷自拍亚洲综合精品第一页 | 日本中文字幕一区 | 福利午夜 | 国产精品99久久久久宅男软件功能 | 亚洲成AV人在线观看无堂无码 | 一区二区三区视频在线看 | 日韩精品中文字幕无码专区 | 亚洲日本在线观看视频 | 给我看免费播放的视频 | 香蕉久久一区二区不卡无毒影院 | 韩国久久久久久 | 国产在线永久免费 | 日本一卡精品视频免费 | 黄色在线观看网址 | 香港三级韩国三级日本三级国产 | 英国少妇色xxxxx | 午夜男女爽爽爽在线视频 | 狠狠色综合7777久夜色撩人 | 少妇推油大尺度在线播放集锦 | 色嫩紧中文字幕在线 | 大地资源高清在线观看免费新浪 | 亚洲AV无码无在线观看 |