久久久久久久av_日韩在线中文_看一级毛片视频_日本精品二区_成人深夜福利视频_武道仙尊动漫在线观看

php 中的closure用法詳解

這篇文章主要介紹了php 中的closure用法詳解,需要的朋友可以參考下

Closure,匿名函數,是php5.3的時候引入的,又稱為Anonymous functions。字面意思也就是沒有定義名字的函數。比如以下代碼(文件名是do.php)

<?php
function A() {
  return 100;
};
function B(Closure $callback)
{
  return $callback();
}
$a = B(A());
print_r($a);//輸出:Fatal error: Uncaught TypeError: Argument 1 passed to B() must be an instance of Closure, integer given, called in D:\web\test\do.php on line 11 and defined in D:\web\test\do.php:6 Stack trace: #0 D:\web\test\do.php(11): B(100) #1 {main} thrown in D:\web\test\do.php on line 6
?>

這里的A()永遠沒有辦法用來作為B的參數,因為A它并不是“匿名”函數。

所以應該改成這樣:

<?php
$f = function () {
  return 100;
};
function B(Closure $callback)
{
  return $callback();
}
$a = B($f);
print_r($a);//輸出100
<?
$func = function( $param ) {
  echo $param;
};
$func( 'hello word' );
//輸出:hello word

實現閉包

將匿名函數在普通函數中當做參數傳入,也可以被返回。這就實現了一個簡單的閉包。

下邊我舉三個例子:

<?php
//例一
//在函數里定義一個匿名函數,并且調用它
function printStr() {
  $func = function( $str ) {
    echo $str;
  };
  $func( ' hello my girlfriend ! ' );
}
printStr();//輸出 hello my girlfriend !
//例二
//在函數中把匿名函數返回,并且調用它
function getPrintStrFunc() {
  $func = function( $str ) {
    echo $str;
  };
  return $func;
}
$printStrFunc = getPrintStrFunc();
$printStrFunc( ' do you love me ? ' );//輸出 do you love me ?
//例三
//把匿名函數當做參數傳遞,并且調用它
function callFunc( $func ) {
  $func( ' no!i hate you ' );
}
$printStrFunc = function( $str ) {
  echo $str.'<br>';
};
callFunc( $printStrFunc );
//也可以直接將匿名函數進行傳遞。如果你了解js,這種寫法可能會很熟悉
callFunc( function( $str ) {
  echo $str; //輸出no!i hate you
} );

連接閉包和外界變量的關鍵字:USE

閉包可以保存所在代碼塊上下文的一些變量和值。PHP在默認情況下,匿名函數不能調用所在代碼塊的上下文變量,而需要通過使用use關鍵字。

換一個例子看看(好吧,我缺錢,我很俗):

<?php
function getMoney() {
  $rmb = 1;
  $dollar = 8;
  $func = function() use ( $rmb ) {
    echo $rmb;
    echo $dollar;
  };
  $func();
}
getMoney();
//輸出:1

可以看到,dollar沒有在use關鍵字中聲明,在這個匿名函數里也就不能獲取到它,所以開發中要注意這個問題。

有人可能會想到,是否可以在匿名函數中改變上下文的變量,但我發現好像是不可以的:

<?php
function getMoney() {
  $rmb = 1;
  $func = function() use ( $rmb ) {
    echo $rmb.'<br>';
    //把$rmb的值加1
    $rmb++;
  };
  $func();
  echo $rmb;
}
getMoney();
//輸出:
//1
//1

額,原來use所引用的也只不過是變量的一個副本clone而已。但是我想要完全引用變量,而不是復制呢?要達到這種效果,其實在變量前加一個 & 符號就可以了:

<?php
function getMoney() {
  $rmb = 1;
  $func = function() use ( &$rmb ) {
    echo $rmb.'<br>';
    //把$rmb的值加1
    $rmb++;
  };
  $func();
  echo $rmb;
}
getMoney();
//輸出:
//1
//2

好,這樣匿名函數就可以引用上下文的變量了。如果將匿名函數返回給外界,匿名函數會保存use所引用的變量,而外界則不能得到這些變量,這樣形成‘閉包'這個概念可能會更清晰一些。

根據描述我們再改變一下上面的例子:

<?php
function getMoneyFunc() {
  $rmb = 1;
  $func = function() use ( &$rmb ) {
    echo $rmb.'<br>';
    //把$rmb的值加1
    $rmb++;
  };
  return $func;
}
$getMoney = getMoneyFunc();
$getMoney();
$getMoney();
$getMoney();
//輸出:
//1
//2
//3

好吧,扯了這么多,那么如果我們要調用一個類里面的匿名函數呢?直接上demo

<?php
class A {
  public static function testA() {
    return function($i) { //返回匿名函數
      return $i+100;
    };
  }
}
function B(Closure $callback)
{
  return $callback(200);
}
$a = B(A::testA());
print_r($a);//輸出 300

其中的A::testA()返回的就是一個無名funciton。

綁定的概念

【網站聲明】本站除付費源碼經過測試外,其他素材未做測試,不保證完整性,網站上部分源碼僅限學習交流,請勿用于商業用途。如損害你的權益請聯系客服QQ:2655101040 給予處理,謝謝支持。

相關文檔推薦

這篇文章主要介紹了PHP有序表查找之插值查找算法,簡單分析了插值查找算法的概念、原理并結合實例形式分析了php實現針對有序表插值查找的相關操作技巧,需要的朋友可以參考下
下面小編就為大家分享一篇ThinkPHP整合datatables實現服務端分頁的示例代碼,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
下面小編就為大家分享一篇PHP實現APP微信支付的實例講解,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
這篇文章主要介紹了PHP實現的多維數組排序算法,結合實例形式對比分析了php針對多維數組及帶有鍵名的多維數組進行排序相關操作技巧與注意事項,需要的朋友可以參考下
這篇文章主要為大家詳細介紹了php結合ajaxuploadfile實現無刷新文件上傳功能,具有一定的參考價值,感興趣的小伙伴們可以參考一下
本篇文章給大家詳細介紹了PHP開發接口使用RSA進行加密解密方法,對此有興趣的朋友可以學習下。
主站蜘蛛池模板: 亚洲精品一级 | 亚洲视频一区在线观看 | 精品福利在线视频 | 91久久久久 | 一级网站 | 国产成都精品91一区二区三 | 欧美黄色片在线观看 | 亚洲欧美国产精品一区二区 | 久久99精品国产麻豆婷婷 | 91免费在线视频 | 欧美激情va永久在线播放 | 男女午夜免费视频 | 2020国产在线 | 日韩欧美一区二区三区免费观看 | 国产精品一区在线观看 | 国产精品不卡视频 | 欧美成人一区二区 | 亚洲一区二区在线免费观看 | 日韩不卡在线 | av乱码 | 亚洲xx在线| 国产在线一区二区三区 | 人人澡视频 | 亚洲精品永久免费 | 欧美一区二区在线播放 | 色婷婷综合久久久久中文一区二区 | 麻豆精品国产91久久久久久 | 成人免费视屏 | 国产成人精品一区二区三区 | 韩日免费视频 | 欧美一区二区三区精品免费 | 久久精品—区二区三区 | 久久人人爽人人爽人人片av免费 | 91精品国产乱码久久久久久久 | 久久大 | 久久99国产精一区二区三区 | 天天操精品视频 | 亚洲精品国产成人 | 51ⅴ精品国产91久久久久久 | 欧美亚洲国产一区二区三区 | 91久久精品日日躁夜夜躁欧美 |