php匿名函數php
匿名函數就是沒有名稱的函數。匿名函數能夠賦值給變量,還能像其餘任何PHP對象那樣傳遞。不過匿名函數還是函數,所以能夠調用,還能夠傳入參數。匿名函數特別適合做爲函數或方法的回調。閉包
如:函數
$f = function($a){this
return $a;spa
};.net
echo $f('hello'); //輸出 hellocode
上面的匿名函數自己沒有名字 爲了方便調用把匿名函數賦值給變量;對象
(function($str){ return $str; })('hello'); //輸出helloblog
匿名函數還可做爲參數使用;作用域
php閉包
閉包是指在建立時封裝周圍狀態的函數。即便閉包所在的環境不存在了,閉包中封裝的狀態依然存在。
注意:「」理論上講,閉包和匿名函數是不一樣的概念。不過,PHP將其視做相同的概念。
PHP閉包和匿名函數使用的句法與普通函數相同,但閉包和匿名函數實際上是 假裝成函數的對象(Closure類的實例) 。
$closure = function($name){ return sprintf("Hello %s", $name); } echo $closure("jerry"); // 檢測$closure變量是不是一個閉包 var_dump($closure instanceof Closure);
__invoke()
方法。
使用use 關鍵字把變量附加閉包上時,附加的變量會記住附加時賦給它的值。
function Car ($name){ return function($statu)use($name){ return sprintf("Car %s is %s", $name, $statu); }; } // 將車名封裝在閉包中 $car = Car("bmw"); // 調用車的動做 echo $car("running"); // 輸出--> "Car bmw is running"
注意:使用 use 關鍵字能夠把多個參數傳入閉包,此時要像PHP函數或方法的參數同樣,使用逗號分隔多個參數。
使用 bindTo() 方法附加閉包的狀態
bindTo() 方法爲閉包增長了一些有趣的潛力。咱們可使用這個方法把 Closure 對象的內部狀態綁定到其它對象上。
bindTo() 方法的第二個參數很重要,其做用是指定綁定閉包的那個對象所屬的PHP類。所以,閉包能夠訪問綁定閉包的對象中受保護和私有的成員變量。
Closure類
1.簡介
用於表明 匿名函數 的類.匿名函數(在 PHP 5.3 中被引入)會產生這個類型的對象。在過去,這個類被認爲是一個實現細節,但如今能夠依賴它作一些事情。自 PHP 5.4 起,這個類帶有一些方法,容許在匿名函數建立後對其進行更多的控制。
除了此處列出的方法,還有一個 __invoke 方法。這是爲了與其餘實現了 __invoke()魔術方法 的對象保持一致性,但調用匿名函數的過程與它無關。
2.用法
function B(Closure $callback)
{
return $callback();
}
此處若調用B函數 傳入參數不能是有名字的函數 即必須是匿名函數;
上面的例子的Closure只是全局的的匿名函數,好了,我如今想指定一個類有一個匿名函數。也能夠理解說,這個匿名函數的訪問範圍再也不是全局的了,是一個類的訪問範圍。
那麼咱們就須要將「一個匿名函數綁定到一個類中」。
使用 bindTo() 方法附加閉包的狀態
bindTo() 方法爲閉包增長了一些有趣的潛力。咱們可使用這個方法把 Closure 對象的內部狀態綁定到其它對象上。
bindTo() 方法的第二個參數很重要,其做用是指定綁定閉包的那個對象所屬的PHP類。所以,閉包能夠訪問綁定閉包的對象中受保護和私有的成員變量。