閉包和匿名函數

概念

閉包是指在創建時封裝周圍狀態的函數.即便閉包所在的環境不存在了,閉包中封裝的狀態依然存在.

匿名函數其實就是沒有名字的函數

從理論上講閉包和匿名函數是不同的概念.但是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

?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容