php的閉包函數use的使用


PHP在默認情況下,匿名函數不能調用所在代碼塊的上下文變量,而需要通過使用use關鍵字。

function  getMoney() {
   $rmb  = 1;
   $dollar  = 6;
   $func  = function () use  ( $rmb  ) {
     echo  $rmb ;
     echo  $dollar ;
   };
   $func ();
}
   
getMoney();
   
//輸出:
//1
//報錯,找不到dorllar變量
//可以看到,dollar沒有在use關鍵字中聲明,在這個匿名函數里也就不能獲取到它,所以開發中要注意這個問題。
 
//是否可以在匿名函數中改變上下文的變量,但我發現是不可以的
function  getMoney() {
   $rmb  = 1;
   $func  = function () use  ( $rmb  ) {
     echo  $rmb ;
     //把$rmb的值加1
     $rmb ++;
   };
   $func ();
   echo  $rmb ;
}
   
getMoney();
   
//輸出:
//1
//1
# 原來 use 所引用的也只不過是變量的一個副本而已。但是我想要完全引用變量,而不是復制。
 
# 要達到這種效果,其實在變量前加一個 & 符號就可以了:
function  getMoney() {
   $rmb  = 1;
   $func  = function () use  ( & $rmb  ) {
     echo  $rmb ;
     //把$rmb的值加1
     $rmb ++;
   };
   $func ();
   echo  $rmb ;
}
   
getMoney();
   
//輸出:
//1
//2
 
/**
好,這樣匿名函數就可以引用上下文的變量了。如果將匿名函數返回給外界,匿名函數會保存use所引用的變量,而外界則不能得到這些變量,這樣形成‘閉包'這個概念可能會更清晰一些。根據描述改變一下上面的例子:
*/
function  getMoneyFunc() {
   $rmb  = 1;
   $func  = function () use  ( & $rmb  ) {
     echo  $rmb ;
     //把$rmb的值加1
     $rmb ++;
   };
   return  $func ;
}
   
$getMoney  = getMoneyFunc();
$getMoney ();
$getMoney ();
$getMoney ();
   
//輸出:
//1
//2
//3
 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM