淺析PHP中的閉包和匿名函數解釋

來源:互聯網
上載者:User
PHP閉包和匿名函數使用的句法與普通函數相同,但閉包和匿名函數其實是偽裝成函數的對象(Closure類的執行個體) 。下面給大家介紹PHP中的閉包和匿名函數知識,需要的朋友參考下吧

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

匿名函數就是沒有名稱的函數。匿名函數可以賦值給變數,還能像其他任何PHP對象那樣傳遞。不過匿名函數仍是函數,因此可以調用,還可以傳入參數。匿名函數特別適合作為函數或方法的回調。

注意:理論上講,閉包和匿名函數是不同的概念。不過,PHP將其視作相同的概念。所以,我們提到閉包時,指的也是匿名函數,反之亦然。

PHP閉包和匿名函數使用的句法與普通函數相同,但閉包和匿名函數其實是 偽裝成函數的對象(Closure類的執行個體) 。

建立閉包

$closure = function($name){  return sprintf("Hello %s", $name);}echo $closure("jerry");// 檢測$closure變數是否是一個閉包var_dump($closure instanceof Closure);

以上代碼建立了一個閉包對象,然後將其賦值給 $closure 變數。閉包和普通的PHP函數很像,使用的句法相同,也接收參數,而且能傳回值。

說明:我們之所以能夠調用 $closure 變數,是因為這個變數的值是一個閉包,而且閉包對象實現了 __invoke() 魔術方法。只要變數名後有 () ,PHP就會尋找並調用 __invoke() 方法。

使用閉包

我們通常把PHP閉包當做當做函數和方法的回調使用。很多PHP函數都會用到回呼函數,例如 array_map() preg_replace_callback() .如下樣本,我們將用 array_map() 處理數組,將數組每一項自增1:

$nubmers = array_map(function($number){  return $number++;}, [1,2,3]);var_dump($numbers);

附加狀態

PHP閉包不會像真正的javascrypt閉包那樣自動封裝應用的狀態,我們必須手動調用閉包對象的 bindTo() 方法或者使用 use 關鍵字,把狀態附加到PHP閉包上。

使用 use 關鍵字

使用 use 關鍵字來附加閉包狀態更加常見,因此我們先來看這種方式。使用 use 關鍵字把變數附加閉包上時,附加的變數會記住附加時賦給它的值。

function Car ($name){  return function($statu)use($name){    return sprintf("Car %s is %s", $name, $statu);   }}// 將車名封裝在閉包中$car = Car("bmw");// 調用車的動作// 輸出--> "bmw is running"echo $car("running");

注意:使用 use 關鍵字可以把多個參數傳入閉包,此時要像PHP函數或方法的參數一樣,使用逗號分隔多個參數。

使用 bindTo() 方法附加閉包的狀態

與其它PHP對象類似,每個閉包執行個體都可以使用 $this 關鍵字擷取閉包的內部狀態。閉包對象的預設狀態沒什麼用,不過有一個 __invoke() 魔術方法和 bindTo() 方法。

bindTo() 方法為閉包增加了一些有趣的潛力。我們可以使用這個方法把 Closure 對象的內部狀態綁定到其它對象上。

bindTo() 方法的第二個參數很重要,其作用是指定綁定閉包的那個對象所屬的PHP類。因此,閉包可以訪問綁定閉包的對象中受保護和私人的成員變數。

class TestClosure{  private $name=[];  private $age;  private $sex;  public function addPerson($name, $personCallback){    // 將閉包對象綁定當前執行個體    $this->name[$name] = $personCallback->bindTo($this, __CLASS__);  }  public function display($name){    foreach ($this->name as $key => $callback){      if($key == $name){        // 執行閉包對象,將閉包狀態附加到類        $callback();      }    }    echo "name : {$name}\n";    echo "age : {$this->age}\n";    echo "sex : {$this->sex}\n";  }}$person = new TestClosure();$person->addPerson("jerry", function(){  $this->age = 19;  $this->sex = "man";});$person->display("jerry");/** outputname : jerryage : 19sex : man*/

總結

以上所述是小編給大家介紹的PHP中的閉包和匿名函數,希望對大家有所協助,如果大家有任何疑問請給我留言,小編會及時回複大家的。在此也非常感謝大家對php中文網的支援!

您可能感興趣的文章:

源碼分析 Laravel 重複執行同一個隊列任務的原因講解

關於 Laravel Redis 多個進程同時取隊列的問題詳解

php-msf源碼的詳解


相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.