php5.3有乙個非常贊的新特性,那就是支援匿名函式(閉包)。匿名函式可用於動態建立函式,並儲存到乙個變數中。舉個栗子:
$func =function();//這裡必須要有;結尾
$func();
複製**
等效於functionfunc()
func();
複製**
看上去沒什麼新奇的地方是不?(☆_☆)/~~
別急,繼續看。
看這段**:
functionoperate($operator);
}else;}}
$subtraction =operate("-");
echo $subtraction(4,3);//1
$addition =operate("+");
echo $addition(1,2);//3
複製**
通過operate函式,我們可以生成不同的函式作為結果返回,並將這個結果直接作為函式呼叫,上面的**分別動態建立了減法運算和加法運算函式。
如果說僅僅是這樣的話,那麼我並不覺得它有多少吸引力,下面我將展示乙個實戰中用到的技巧:
<?php
header("content-type:text/html;charset=utf-8");
classdi
publicfunctionget($id)
}classuser
functiongetusername()
}//從這裡開始看
$di =newdi();
$di->set("zhangsan",function());
$di->set("lisi",function());
echo $di->get("zhangsan")->getusername();
echo $di->get("lisi")->getusername();
複製**
**中有乙個di容器用來儲存物件例項,然後通過set()方法註冊服務,通過get()方法獲取服務。
我們看到$di->set()的時候,使用了匿名函式,我們預先註冊了zhangsan和lisi兩個服務,這兩個服務都是user類的例項,在$di->set的時候實際上並沒有例項化,而是在$di->get()的時候才執行了匿名函式並將物件返回,這就實現了按需例項化,不用則不例項化,提高效率。
閉包特性:
經常寫js的同學應該知道js的閉包特性,簡單的說就是在乙個函式裡可以定義子函式,父函式中的變數在子函式中可以直接使用,那麼php的閉包怎麼用呢?有一點區別。
functionfunc1($a);
}$a =func1("a");
$a();//輸出a
複製**
當你想將外層變數傳進內層匿名函式時,使用use (變數)的方式。
閉包的用途可以用於很多地方,常見於di模式中,這篇文章的**只是為了說明,不可以直接使用,謝謝。
Redux Hooks 玩轉redux閉包
使用react hooks實現一版簡易redux,主要實現redux中介軟體機制,看看redux作者如何把閉包玩轉 首先這裡提一下閉包 我個人對閉包的認識 可能有的人認為函式返回函式就是閉包,但實則不然,簡單來說,函式返回函式會形成閉包,但它不算是閉包。如何理解這句話呢?閉包其實和詞法作用域相關,函...
php的閉包函式bingto php的閉包函式
toc 1 閉包 匿名 函式的意義 閉包 匿名 函式通常作為簡單函式功能的實現。閉包 匿名 函式可以 賦值給變數 或者 作為引數使用 閉包 匿名 函式是 函式程式設計 的基礎 2 閉包 匿名 函式的使用 2 1 匿名函式賦值給變數 greet function name printf hello s...
PHP中的閉包
sayhello function name sayhello world 輸出 hello world var dump sayhello instanceof closure 輸出 boolean true name world sayhello function use name 這裡不要忘記...