真实的国产乱ⅩXXX66竹夫人,五月香六月婷婷激情综合,亚洲日本VA一区二区三区,亚洲精品一区二区三区麻豆

成都創(chuàng)新互聯(lián)網(wǎng)站制作重慶分公司

PHP中什么是閉包和匿名函數(shù)

PHP中什么是閉包和匿名函數(shù),很多新手對此不是很清楚,為了幫助大家解決這個難題,下面小編將為大家詳細講解,有這方面需求的人可以來學習下,希望你能有所收獲。

讓客戶滿意是我們工作的目標,不斷超越客戶的期望值來自于我們對這個行業(yè)的熱愛。我們立志把好的技術通過有效、簡單的方式提供給客戶,將通過不懈努力成為客戶在信息化領域值得信任、有價值的長期合作伙伴,公司提供的服務項目有:申請域名、網(wǎng)絡空間、營銷軟件、網(wǎng)站建設、英吉沙網(wǎng)站維護、網(wǎng)站推廣。

閉包是指在創(chuàng)建時封裝周圍狀態(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ù),反之亦然。

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

創(chuàng)建閉包

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

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

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

使用閉包

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

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

附加狀態(tài)

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

使用 use 關鍵字

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

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

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

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

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

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

bindTo() 方法的第二個參數(shù)很重要,其作用是指定綁定閉包的那個對象所屬的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){
        // 執(zhí)行閉包對象,將閉包狀態(tài)附加到類
        $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
*/

看完上述內(nèi)容是否對您有幫助呢?如果還想對相關知識有進一步的了解或閱讀更多相關文章,請關注創(chuàng)新互聯(lián)行業(yè)資訊頻道,感謝您對創(chuàng)新互聯(lián)的支持。


本文標題:PHP中什么是閉包和匿名函數(shù)
分享網(wǎng)址:http://weahome.cn/article/pdjees.html

其他資訊

在線咨詢

微信咨詢

電話咨詢

028-86922220(工作日)

18980820575(7×24)

提交需求

返回頂部