中文字幕av专区_日韩电影在线播放_精品国产精品久久一区免费式_av在线免费观看网站

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

PHP中閉包函數和匿名函數的區別是什么

發布時間:2020-12-18 15:17:39 來源:億速云 閱讀:399 作者:Leah 欄目:開發技術

本篇文章為大家展示了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");
/** output
name : jerry
age : 19
sex : man
*/

上述內容就是PHP中閉包函數和匿名函數的區別是什么,你們學到知識或技能了嗎?如果還想學到更多技能或者豐富自己的知識儲備,歡迎關注億速云行業資訊頻道。

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

唐海县| 永仁县| 杭锦后旗| 固原市| 蛟河市| 乌审旗| 大洼县| 阿勒泰市| 响水县| 通河县| 冀州市| 会同县| 江阴市| 临漳县| 攀枝花市| 太仓市| 兴义市| 桦川县| 湛江市| 五寨县| 蒙城县| 凤翔县| 扎兰屯市| 长葛市| 夏河县| 镇江市| 和龙市| 武隆县| 晴隆县| 那坡县| 吉水县| 平顶山市| 淅川县| 万年县| 呼伦贝尔市| 木兰县| 岫岩| 广西| 乐山市| 阿鲁科尔沁旗| 通州市|