php中的閉包,以前不理解。之前項目中雖然有用到,也是別人怎麼用,本身也跟着怎麼用,也沒具體去看一下,時間長了就忘了,也不知道閉包是怎麼回事。今天網上搜集了關於php閉包相關的文章,看了7,8篇,乾貨很少,大都複製粘貼黨,如今根據本身的理解小結一下php
閉包支持版本閉包
根據官方文檔裏說的closure是5.3.0以後才支持以及不少文章說php是5.3.0以後才引入的,也沒親自驗證過,暫時就理解爲php版本大於5.3.0纔有了閉包概念,支持閉包。函數
語法3d
函數:function func ($arg = xxx) {xxx};指針
匿名函數: 沒有函數名的函數 好比 function($arg = xxx){xxx};blog
閉包:匿名函數加上use用法 好比 function($arg = xxx)use ($a, $b) {xxx};遞歸
對比內存
函數:相關語句塊的集合,能夠根據傳入的條件完成一個小功能。文檔
匿名函數:雖然有了函數,可是函數起名字是一件較麻煩的事,且在同一命名空間下,函數命名有可能出現重複。一旦出現重複,程序就會報錯。因此有了匿名函數。io
閉包:匿名函數的增長版,添加了use用法,申明時獲取上下文內容,而不是調用時才獲取。
閉包優勢
網上說閉包有減小foreach,減小函數參數,減小遞歸等好處,感受這些和閉包關係不大。我的認爲,閉包帶來的最大好處在於use。
php中變量有引用一說(其餘語言中也有相似的說法),use中的變量存放的多是一個變量的值拷貝,也多是一塊內存地址(相似於c語言中的指針)
use中變量存放引用(內存地址)比較好的例子計數器,簡易代碼以下
$start = 0;
$funcCount = function () use (&$start) {$start++; return $start;};
unset($start);
以上3行代碼就定義了一個簡單的計數器,變量start銷燬後,因爲閉包中有對start的引用,因此start以前指向的內存地址不會被回收,此時這塊內存地址就脫離程序的掌控,經過$funcCount()能夠訪問到這塊內存,執行計數操做並返回,該地址中的值修改常理來講只會被該匿名函數修改,不會被其餘程序誤改。
暫時就說到這裏,有不對的地方,歡迎批評指正,共同進步