Swoole的閉包寫法,很nice

今天寫一篇文章來專門介紹一下PHP的閉包淡诗。從5.3版本開始PHP就增加了匿名函數(shù)支持骇塘,經(jīng)過數(shù)個(gè)版本迭代到現(xiàn)在的PHP5.6、PHP7韩容,PHP語言的閉包已經(jīng)非常完善了款违。再結(jié)合Swoole提供的事件驅(qū)動(dòng)支持,PHP的閉包功能非常強(qiáng)大而且很優(yōu)雅群凶。

匿名函數(shù)

匿名函數(shù)是閉包的核心插爹,匿名函數(shù)在PHP里實(shí)際上是一個(gè)Closure類的對象(請注意是對象)。與普通的面向?qū)ο缶幊谭绞讲煌肷遥涿瘮?shù)的代碼是直接寫在調(diào)用處的赠尾,不需要額外寫一個(gè)類,編寫方法的代碼毅弧。這樣的好處就是更直接气嫁。下面的示例是設(shè)置一個(gè)定時(shí)器,每2秒輸出hello world够坐。

傳統(tǒng)寫法

閉包寫法

非閉包的傳統(tǒng)寫法寸宵,先要聲明一個(gè)函數(shù),再轉(zhuǎn)入函數(shù)名稱字符串元咙。兩段代碼是分離的梯影,不夠直觀。而閉包的寫法把定時(shí)器的聲明和定時(shí)器要執(zhí)行的代碼寫在了一起庶香,邏輯非常清晰直觀甲棍。使用閉包語法可以很方便編寫回調(diào)函數(shù)。在事件驅(qū)動(dòng)編程赶掖、排序感猛、array_walk等需要用戶傳入一段執(zhí)行代碼的場景中七扰,閉包的寫法非常優(yōu)雅。

閉包更強(qiáng)大的地方在于它可以直接在調(diào)用處引入外部變量唱遭。PHP中實(shí)現(xiàn)的方法就是use關(guān)鍵詞戳寸。

Use語法

如果剛才的定時(shí)器需要傳入一個(gè)變量,傳統(tǒng)的寫法只能通過全局變量來實(shí)現(xiàn)拷泽。與JS不同疫鹊,PHP的變量引入是顯式的,如果要引用外部變量必須使用use來聲明司致。而JS是隱式的拆吆,匿名函數(shù)內(nèi)部可以隨意操作外部變量,無需聲明脂矫。這樣好處是少寫了一點(diǎn)代碼枣耀,缺點(diǎn)是存在風(fēng)險(xiǎn)和混亂。

傳統(tǒng)寫法

閉包寫法

閉包寫法使用use直接引入了當(dāng)前的$str變量庭再,而不需要使用global全局變量捞奕。另外如果是在swoole的事件驅(qū)動(dòng)編程模式,使用global就無法實(shí)現(xiàn)異步并發(fā)了拄轻,因?yàn)間lobal全局變量只有1個(gè)颅围,如果同時(shí)有多個(gè)客戶端請求,每個(gè)請求要查詢數(shù)據(jù)庫恨搓,輸出不同的內(nèi)容院促,傳統(tǒng)的編程方法就不太容易實(shí)現(xiàn),需要使用全局變量數(shù)組斧抱,以客戶端的ID為KEY保存各自的數(shù)據(jù)常拓。

傳統(tǒng)寫法

閉包寫法


傳統(tǒng)的寫法非常復(fù)雜,需要反復(fù)多次從全局?jǐn)?shù)組保存/提取數(shù)據(jù)辉浦。而閉包的寫法非常簡潔優(yōu)雅弄抬,只用了幾行代碼就實(shí)現(xiàn)了同樣的功能。閉包寫法非常適合用來編寫異步非阻塞回調(diào)模式的服務(wù)器程序宪郊。目前熱門的編程語言中只有PHP和JS具備這種能力眉睹。

閉包更多特性

在類的方法中使用匿名函數(shù),5.4以上的版本無需使用use引入this废膘,直接可以在匿名函數(shù)中使用this,直接可以在匿名函數(shù)中使用this來調(diào)用當(dāng)前對象的方法慕蔚。在swoole編程中丐黄,可以利用此特性減少$serv對象的use引入傳遞。

另外如果希望在閉包函數(shù)中修改外部變量孔飒,可以在use時(shí)為變量增加&引用符號即可灌闺。注意對象類型不需要加&艰争,因?yàn)樵赑HP中對象默認(rèn)就是傳引用而非傳值。


更多學(xué)習(xí)內(nèi)容可以訪問【對標(biāo)大廠】精品PHP架構(gòu)師教程目錄大全桂对,只要你能看完保證薪資上升一個(gè)臺階(持續(xù)更新)

以上內(nèi)容希望幫助到大家甩卓,很多PHPer在進(jìn)階的時(shí)候總會遇到一些問題和瓶頸,業(yè)務(wù)代碼寫多了沒有方向感蕉斜,不知道該從那里入手去提升逾柿,對此我整理了一些資料,包括但不限于:分布式架構(gòu)宅此、高可擴(kuò)展机错、高性能、高并發(fā)父腕、服務(wù)器性能調(diào)優(yōu)弱匪、TP6,laravel璧亮,YII2萧诫,Redis,Swoole枝嘶、Swoft帘饶、Kafka、Mysql優(yōu)化躬络、shell腳本尖奔、Docker、微服務(wù)穷当、Nginx等多個(gè)知識點(diǎn)高級進(jìn)階干貨需要的可以免費(fèi)分享給大家提茁,需要的可以加入我的PHP技術(shù)交流群953224940

進(jìn)階PHP月薪30k>>>架構(gòu)師成長路線【視頻、面試文檔免費(fèi)獲取】

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末馁菜,一起剝皮案震驚了整個(gè)濱河市茴扁,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌汪疮,老刑警劉巖峭火,帶你破解...
    沈念sama閱讀 206,839評論 6 482
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異智嚷,居然都是意外死亡卖丸,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,543評論 2 382
  • 文/潘曉璐 我一進(jìn)店門盏道,熙熙樓的掌柜王于貴愁眉苦臉地迎上來稍浆,“玉大人,你說我怎么就攤上這事⌒品悖” “怎么了嫁艇?”我有些...
    開封第一講書人閱讀 153,116評論 0 344
  • 文/不壞的土叔 我叫張陵,是天一觀的道長弦撩。 經(jīng)常有香客問我步咪,道長,這世上最難降的妖魔是什么益楼? 我笑而不...
    開封第一講書人閱讀 55,371評論 1 279
  • 正文 為了忘掉前任猾漫,我火速辦了婚禮,結(jié)果婚禮上偏形,老公的妹妹穿的比我還像新娘静袖。我一直安慰自己,他們只是感情好俊扭,可當(dāng)我...
    茶點(diǎn)故事閱讀 64,384評論 5 374
  • 文/花漫 我一把揭開白布队橙。 她就那樣靜靜地躺著,像睡著了一般萨惑。 火紅的嫁衣襯著肌膚如雪捐康。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 49,111評論 1 285
  • 那天庸蔼,我揣著相機(jī)與錄音解总,去河邊找鬼。 笑死姐仅,一個(gè)胖子當(dāng)著我的面吹牛花枫,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播掏膏,決...
    沈念sama閱讀 38,416評論 3 400
  • 文/蒼蘭香墨 我猛地睜開眼劳翰,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了馒疹?” 一聲冷哼從身側(cè)響起佳簸,我...
    開封第一講書人閱讀 37,053評論 0 259
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎颖变,沒想到半個(gè)月后生均,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 43,558評論 1 300
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡腥刹,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,007評論 2 325
  • 正文 我和宋清朗相戀三年马胧,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片衔峰。...
    茶點(diǎn)故事閱讀 38,117評論 1 334
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡漓雅,死狀恐怖录别,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情邻吞,我是刑警寧澤,帶...
    沈念sama閱讀 33,756評論 4 324
  • 正文 年R本政府宣布葫男,位于F島的核電站抱冷,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏梢褐。R本人自食惡果不足惜旺遮,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,324評論 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望盈咳。 院中可真熱鬧耿眉,春花似錦、人聲如沸鱼响。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,315評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽丈积。三九已至筐骇,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間江滨,已是汗流浹背铛纬。 一陣腳步聲響...
    開封第一講書人閱讀 31,539評論 1 262
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留唬滑,地道東北人告唆。 一個(gè)月前我還...
    沈念sama閱讀 45,578評論 2 355
  • 正文 我出身青樓,卻偏偏與公主長得像晶密,于是被迫代替她去往敵國和親擒悬。 傳聞我的和親對象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 42,877評論 2 345

推薦閱讀更多精彩內(nèi)容

  • PHP+Swoole的閉包寫法 2016年10月25日韓 天峰 JS程序員總是嘲笑PHP沒有閉包惹挟,今天抽空寫一篇文...
    青夢馬閱讀 270評論 0 0
  • 一. 閉包函數(shù)又叫做匿名函數(shù)(沒有函數(shù)名稱的函數(shù)). 英文closure 匿名函數(shù)常在js函數(shù)中出現(xiàn),比如ajax...
    oYoY閱讀 299評論 0 0
  • 概念 閉包是指在創(chuàng)建時(shí)封裝周圍狀態(tài)的函數(shù).即便閉包所在的環(huán)境不存在了,閉包中封裝的狀態(tài)依然存在. 匿名函數(shù)其實(shí)就是...
    zhyke閱讀 595評論 0 0
  • 一茄螃、涉及的計(jì)算機(jī)基礎(chǔ)知識 通信網(wǎng)絡(luò)全雙工/單工/半雙工:1、單工:數(shù)據(jù)只在一個(gè)方向上傳輸连锯,不能實(shí)現(xiàn)雙方通信归苍。如:閉...
    翁支和閱讀 5,108評論 0 4
  • 一. 什么是閉包? 先看看百度百科的介紹: 閉包包含自由(未綁定到特定對象)變量运怖,這些變量不是在這個(gè)代碼塊內(nèi)或者...
    Anomaly閱讀 599評論 0 0