久久久久久久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進行加密解密方法,對此有興趣的朋友可以學習下。
主站蜘蛛池模板: 亚洲精品免费在线 | 欧美一区二区三区久久精品 | 亚州精品成人 | 日韩无 | 国产精品国产亚洲精品看不卡15 | 亚洲视频一区二区 | 成人精品久久 | 一道本不卡视频 | 日韩精品视频一区二区三区 | 国产精品18久久久 | 亚洲一区二区在线免费观看 | 天天操狠狠操 | 午夜精品久久久久久久久久久久 | 久草福利| 久久综合九色综合欧美狠狠 | 日韩av成人 | 熟女毛片| 国产在线精品一区二区 | 亚洲国产精品一区二区第一页 | 精品国产欧美在线 | 亚洲高清在线 | 国产欧美一区二区三区久久人妖 | 成人视屏在线观看 | 亚洲系列第一页 | 91在线第一页 | 99久久99 | 天天干视频网 | 欧美激情国产精品 | 国内精品久久精品 | www日日日 | 久久久久久成人网 | 全免费a级毛片免费看视频免费下 | 国产欧美日韩一区 | 日日操操 | 美女久久久久久久 | 激情一区二区三区 | 亚洲午夜精品视频 | 九九国产在线观看 | 日韩精品免费视频 | 男人视频网站 | 午夜天堂精品久久久久 |