看過許多關於PHP中閉包的講解,每一個文檔想要表達的意思大致相同,可是理解起來很費勁,我根據自身理解加以描述,有更好的理解請指出閉包
衆所周知,你們都知道PHP的閉包是function () use (){};
函數
本文分爲3步
1:講解閉包的使用
2:閉包實例
3:閉包總結code
一、講解閉包的使用
1:閉包中的use使用-上篇對象
function () use($param){};
$param = 1; $data = function () use ($param) { var_dump($param); }; $data(); $param = 2; $data(); // 輸出結果爲 1 1
分析結果:use的用法至關於對象(類的用法),$data()
,表示實例化一次,然而語言有着文本流的特性,第二次$data()
沒有從新實例,實例的時候取到的值是1,因此輸出結果爲上面結果;文檔
2:閉包中的use使用-下篇io
$param = 1; $data = function () use ($param) { var_dump($param); }; $data(); $param = 2; $data = function () use ($param) { var_dump($param); }; $data(); // 輸出結果爲 1 2
分析結果:文本流的形式,又實例化一次變量因此存儲變量爲2,最終輸出爲2;function
3:閉包中function()後面的括號,use前面的括號用法變量
function ($obj) use($param){};
$param = 1; $data = function ($obj) use ($param) { var_dump($obj); var_dump($param); }; $data(2); $data(3); $param = 2; $data(4); // 輸出 2 1 3 1 4 1
分析結果:function後面的括號至關於函數的用法,每次調用函數時傳入數據同樣,每次都須要傳入,後面的use表示實例一次後不變,因此obj隨時改變。foreach
二、閉包實例循環
例子1:
$arr = [ '米' => ['鹹粥', '甜粥', '米飯'], '面' => ['麪條', '花捲', '饅頭'], ]; $param = ''; $bag = function ($data) use ($param) { $l = count($data); return $data[rand(0, $l-1)]; }; $eat_arr = []; foreach ($arr as $key => $value) { $each_arr[] = '吃'.$key.':'.$bag($value); } echo implode(',', $each_arr); // 輸出 吃米:米飯, 吃麪:麪條 吃米:甜粥, 吃麪:饅頭
例子2:
$arr = [ '米' => ['鹹粥', '甜粥', '米飯'], '面' => ['麪條', '花捲', '饅頭'], ]; $eat_arr = []; foreach ($arr as $key => $value) { $bag = function () use ($value) { $l = count($value); return $value[rand(0, $l-1)]; }; $each_arr[] = '吃'.$key.':'.$bag(); } echo implode(',', $each_arr); // 輸出 吃米:甜粥, 吃麪:麪條 吃米:甜粥, 吃麪:花捲
三、閉包總結
閉包總結到最後,就是與函數不一樣的地方就是多加了一個use中間值,使用的時候注意一點是function後面的()爲可變變量,use()裏面的變量爲實例一次後不改動的變量,循環裏面寫閉包這種方法不是很好用,至關於每次都實例,因此閉包的寫法能夠先定義一個方法在調用。
閉包與函數真正的區別:
函數:封裝一次多處調用。 閉包:只限於本方法使用,耦合度低到忽略。