国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 語言 > PHP > 正文

淺析PHP中的閉包和匿名函數(shù)

2024-09-04 11:42:21
字體:
供稿:網(wǎng)友

PHP閉包和匿名函數(shù)使用的句法與普通函數(shù)相同,但閉包和匿名函數(shù)其實(shí)是偽裝成函數(shù)的對象(Closure類的實(shí)例) 。下面給大家介紹PHP中的閉包和匿名函數(shù)知識,需要的朋友參考下吧

閉包是指在創(chuàng)建時(shí)封裝周圍狀態(tài)的函數(shù)。即使閉包所在的環(huán)境不存在了,閉包中封裝的狀態(tài)依然存在。

匿名函數(shù)就是沒有名稱的函數(shù)。匿名函數(shù)可以賦值給變量,還能像其他任何PHP對象那樣傳遞。不過匿名函數(shù)仍是函數(shù),因此可以調(diào)用,還可以傳入?yún)?shù)。匿名函數(shù)特別適合作為函數(shù)或方法的回調(diào)。

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

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

創(chuàng)建閉包

  1. $closure = function($name){ 
  2.   return sprintf("Hello %s"$name); 
  3. echo $closure("jerry"); 
  4. // 檢測$closure變量是否是一個(gè)閉包 
  5. var_dump($closure instanceof Closure); 

以上代碼創(chuàng)建了一個(gè)閉包對象,然后將其賦值給 $closure 變量。閉包和普通的PHP函數(shù)很像,使用的句法相同,也接收參數(shù),而且能返回值。

說明:我們之所以能夠調(diào)用 $closure 變量,是因?yàn)檫@個(gè)變量的值是一個(gè)閉包,而且閉包對象實(shí)現(xiàn)了 __invoke() 魔術(shù)方法。只要變量名后有 () ,PHP就會查找并調(diào)用 __invoke() 方法。

使用閉包

我們通常把PHP閉包當(dāng)做當(dāng)做函數(shù)和方法的回調(diào)使用。很多PHP函數(shù)都會用到回調(diào)函數(shù),例如 array_map() 和 preg_replace_callback() .如下示例,我們將用 array_map() 處理數(shù)組,將數(shù)組每一項(xiàng)自增1:

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

附加狀態(tài)

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

使用 use 關(guān)鍵字

使用 use 關(guān)鍵字來附加閉包狀態(tài)更加常見,因此我們先來看這種方式。使用 use 關(guān)鍵字把變量附加閉包上時(shí),附加的變量會記住附加時(shí)賦給它的值。

  1. function Car ($name){ 
  2.   return function($statu)use($name){ 
  3.     return sprintf("Car %s is %s"$name$statu);  
  4.   } 
  5. // 將車名封裝在閉包中 
  6. $car = Car("bmw"); 
  7. // 調(diào)用車的動作 
  8. // 輸出--> "bmw is running" 
  9. echo $car("running"); 

注意:使用 use 關(guān)鍵字可以把多個(gè)參數(shù)傳入閉包,此時(shí)要像PHP函數(shù)或方法的參數(shù)一樣,使用逗號分隔多個(gè)參數(shù)。

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

與其它PHP對象類似,每個(gè)閉包實(shí)例都可以使用 $this 關(guān)鍵字獲取閉包的內(nèi)部狀態(tài)。閉包對象的默認(rèn)狀態(tài)沒什么用,不過有一個(gè) __invoke() 魔術(shù)方法和 bindTo() 方法。

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

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

  1. class TestClosure 
  2.   private $name=[]; 
  3.   private $age
  4.   private $sex
  5.   public function addPerson($name$personCallback){ 
  6.     // 將閉包對象綁定當(dāng)前實(shí)例 
  7.     $this->name[$name] = $personCallback->bindTo($this__CLASS__); 
  8.   } 
  9.   public function display($name){ 
  10.     foreach ($this->name as $key => $callback){ 
  11.       if($key == $name){ 
  12.         // 執(zhí)行閉包對象,將閉包狀態(tài)附加到類 
  13.         $callback(); 
  14.       } 
  15.     } 
  16.     echo "name : {$name}/n"
  17.     echo "age : {$this->age}/n"
  18.     echo "sex : {$this->sex}/n"
  19.   } 
  20. $person = new TestClosure(); 
  21. $person->addPerson("jerry"function(){ 
  22.   $this->age = 19; 
  23.   $this->sex = "man"
  24. }); 
  25. $person->display("jerry"); 
  26. /** output 
  27. name : jerry 
  28. age : 19 
  29. sex : man 
  30. */

發(fā)表評論 共有條評論
用戶名: 密碼:
驗(yàn)證碼: 匿名發(fā)表
主站蜘蛛池模板: 安达市| 柳州市| 乌拉特后旗| 泌阳县| 鄢陵县| 石门县| 南川市| 秦皇岛市| 安宁市| 滦平县| 灌南县| 留坝县| 阿鲁科尔沁旗| 江源县| 曲沃县| 乐亭县| 丽江市| 彩票| 房山区| 皋兰县| 灵山县| 兴和县| 蓝山县| 沙坪坝区| 神池县| 玛多县| 湘潭市| 彝良县| 理塘县| 高台县| 朔州市| 龙口市| 乌拉特后旗| 烟台市| 西峡县| 石河子市| 南部县| 贵德县| 张家川| 泗阳县| 湟源县|