php Closure類 閉包 匿名函數

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);        
    說明:咱們之因此可以調用 $closure 變量,是由於這個變量的值是一個閉包,並且閉包對象實現了 __invoke() 魔術方法(把一個對象當成函數執行)。只要變量名後有 () ,PHP就會查找並調用 __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類。所以,閉包能夠訪問綁定閉包的對象中受保護和私有的成員變量。

相關文章
相關標籤/搜索