概念
閉包是指在創建時封裝周圍狀態的函數.即便閉包所在的環境不存在了,閉包中封裝的狀態依然存在.
匿名函數其實就是沒有名字的函數
從理論上講閉包和匿名函數是不同的概念.但是php將其視作為相同的概念
注意:閉包和匿名函數其實是偽裝成函數的對象.如果審查PHP閉包或匿名函數,會發現它們是Closure類的實例
上面的案例中之所以能調用$closure變量,是因為閉包對象實現了__invoke()
魔術方法當嘗試以調用函數的方式調用一個對象時,__invoke()方法會被自動調用。
連接閉包和外界變量的關鍵字:USE
有些方法你是不能改動函數的參數數量的.比如swoole,但是你又想從外面帶參數給匿名函數中使用,這個時候我們就可以用use
閉包可以保存所在代碼塊上下文的一些變量和值。PHP在默認情況下,匿名函數不能調用所在代碼塊的上下文變量,而需要通過使用use關鍵字。
換一個例子看看:
function getMoney() {
? ? $rmb = 1;
? ? $dollar = 6;
? ? $func = function() use ( $rmb ) {
? ? ? ? echo $rmb;
? ? ? ? echo $dollar;
? ? };
? ? $func();
}
getMoney();
//輸出:
//1
//報錯,找不到dorllar變量
可以看到,dollar沒有在use關鍵字中聲明,在這個匿名函數里也就不能獲取到它
是否可以在匿名函數中改變上下文的變量,是不可以的:
function getMoney() {
? ? $rmb = 1;
? ? $func = function() use ( $rmb ) {
? ? ? ? echo $rmb;
? ? ? ? //把$rmb的值加1
? ? ? ? $rmb++;
? ? };
? ? $func();
? ? echo $rmb;
}
getMoney();
//輸出:
//1
//1
use所引用的也只不過是變量的一個副本而已。但是我想要完全引用變量,而不是復制。
要達到這種效果,其實在變量前加一個 & 符號就可以了
4種PHP回調函數風格
匿名函數
$server->on('Request', function ($req, $resp) {
? ? echo "hello world";
});
類靜態方法
class A{
? ? static function test($req, $resp) {
? ? ? ? echo "hello world";
? ? }
}
$server->on('Request', 'A::Test');
$server->on('Request', array('A', 'Test'));
函數
function my_onRequest($req, $resp){
? ? echo "hello world";
}
$server->on('Request', 'my_onRequest');
對象方法
class A{
? ? function test($req, $resp) {
? ? ? ? echo "hello world";
? ? }
}
$object = new A();
$server->on('Request', array($object, 'test'));
參考
Modern? PHP