今天寫一篇文章來專門介紹一下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