登入
首頁 所有文章 PHP PHP閉包(匿名函式)與繫結狀態
長也   2018-05-24 22:12:41(1年前)    482點閱   0喜歡  0收藏
PHP閉包(匿名函式)與繫結狀態  

閉包與匿名函式

閉包是創造時就封裝了內部狀態的函式,即使函式已經結束了,但狀態會一直被保存在閉包中。匿名函式就是沒有名字的函式,匿名函式可以跟其他物件一樣指派給變數。

在PHP中,閉包與匿名函式視為同樣的東西。

建立閉包

$plusone=function ($num){
    return $num+1;
};
echo $plusone(50)."
";

閉包的建立就與函式的宣告一樣,差異只在於沒有命字,並且將它指定給一個變數。

$numplusone=array_map(function ($num){
    return $num+1;
},[1,2,3]);
print_r($numplusone);
echo "
";

上面這個範例也是一個閉包,放於array_map函式中;當然也可不使用閉包,而將函式分離,但這樣代碼並不是很簡潔。

繫結狀態

PHP與JavaScript不同,閉包並不會自動繫結,而必須使用use關鍵字或bindTo()方法繫結上,這裡只示範use關鍵字的用法。

//繫結狀態
function where($name){
    return function ($address) use ($name){
      return sprintf("%s 在 %s",$name,$address);
    };
}
$ted=where("ted");
echo $ted("捷運都會公園站");

呼叫where時,會先將$name輸入的ted關閉在閉包中,再呼叫閉包,這樣會輸出"ted在捷運都會公園站"。

use關鍵字也可以傳入多參數,如同使用任何函式一樣,以逗號分隔。

結論

值得再提的是,閉包是一個物件,在上面的範例中回傳的閉包物件會保護已經輸入的$name,即使已經離開函式where,$name依然會存在閉包之中。

本文作者:長也

糾結與想不開的資管系學生,之前常碰PHP,現在常碰到的是Python,閒暇之餘就記錄一些筆記。

             

如要發表回覆,請先 登入

  0則回覆