国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 編程 > PHP > 正文

詳解php中匿名函數和閉包函數

2020-03-22 18:42:47
字體:
來源:轉載
供稿:網友

本篇文章給大家分享的內容是詳解php中匿名函數和閉包函數,有著一定的參考價值,有需要的朋友可以參考一下

php的匿名函數和閉包函數


tags: 匿名函數 閉包函數 php閉包函數 php匿名函數 function use


引言:匿名函數和閉包函數都不是特別高深的知識,但是很多剛入門的朋友卻總是很困惑,因為大家習慣上寫了函數就是用來調用的,匿名函數和閉包函數做什么用的?

匿名函數

php官方解釋如下:
匿名函數(Anonymous functions),也叫閉包函數(closures),允許 臨時創建一個沒有指定名稱的函數。最經常用作回調函數(callback)參數的值。當然,也有其它應用的情況。

這里說的很簡單,可以用做回調函數,下面例子就是作為回調函數的

<?phpecho preg_replace_callback('~-([a-z])~', function ($match) {    return strtoupper($match[1]);}, 'hello-world');// 輸出 helloWorld?>

上述例子中,preg_replace_callback 函數需要三個參數,第一個參數是一個html' target='_blank'>正則表達式用來匹配數據,第二個參數是一個函數,第三個參數是需要匹配的字符串,也可以像下面這樣寫

<?php$testFunc = function ($match) {        return strtoupper($match[1]);    };  echo preg_replace_callback('~-([a-z])~', $testFunc, 'hello-world'); // 輸出 helloWorld ?>

但是我們看到這個方法顯然我們只需要用一次,所以沒有必要再給他去命名,也沒有多大的必要再去把他賦值給一個變量(賦值給變量的過程:PHP 會自動把此種表達式轉換成內置類 Closure 的對象實例賦值給變量)

閉包函數

php中匿名函數也叫閉包函數,所以沒什么區別。但是一般意義上的閉包的概念不是這樣的,我們先說一下傳統意義上的閉包,并提供一篇文章中js中的閉包用來和php中的閉包(匿名函數)進行對比。
學習Javascript閉包(Closure)—阮一峰

php中其實沒有傳統意義上的閉包函數,因為php中的函數不能調用夫作用域中的變量。如下

<?php    function a(){        $a = 11;                function b(){            $b = 22;                        echo $a;                        echo $b;        }        b();    }    a();    //報Notice:Undefined variable: a in index.php on line 6    //22    ?>

而看上面文章中得知,js中是可以的。所以php中匿名函數也叫閉包函數,也可以傳遞父作用域的變量進閉包函數(達到了類似js獲取父作用域變量的效果),php中使用的是use關鍵字,具體如下

<?php$count = 0;$a = function(){ var_dump($count); };$b = function() use ($count){ var_dump($count); };$count++;$c = function() use (&$count){ var_dump($count); };$count++;$a();    // null   Notice: Undefined variable: count in$b();    // int 0$c();    // int 2$count++;$b();    // int 0?>

上述例子的輸出和你認為的是不是不同呢。

解析:閉包函數(匿名函數)使用use獲取函數定義時的副作用域變量,不管在何時調用。如果要獲取調用時的變量值,需要用引用傳遞。具體怎么使用就要看什么使用場景了。

列舉了幾種常用的場景
  1. 作為回調函數

    //一個我們使用過的例子<?php/* * 菜譜拆分食物后的拼接 * 參數均不能為空 * */public function mergeFoodsStr($str,array $mapping){ //        $str = '白菜半棵、__2__鮑菇兩只、__0__一根,__1__兩根,三者比例為100:100:15,醬油5克,香油2克,鹽1克。';//        $mapping = array(//            0 =>array('name' => '胡蘿卜','id' =>  '81' ),//            1 =>array ( 'name' => '蘿卜', 'id' =>  '72'),//            2 =>array ( 'name' =>  '杏', 'id' => '1841')//        );    if(empty($str) || empty($mapping)){        return false;    }    $strNew = preg_replace_callback('"|__(/d)__|" ',function ($matches) use ($mapping){        return $mapping[$matches[1]]['name'];    },$str);    $this->log('拼接后的食材字符串',$strNew);    return $strNew;}?>
  2. 如果是一次性使用的函數,不能被重用,可以使用閉包函數

  3. 使用array_work()函數配合匿名函數來減少foreach層數

  4. 等等

以上就是詳解php中匿名函數和閉包函數的詳細內容,更多請關注 其它相關文章!

鄭重聲明:本文版權歸原作者所有,轉載文章僅為傳播更多信息之目的,如作者信息標記有誤,請第一時間聯系我們修改或刪除,多謝。

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 西藏| 定安县| 泗洪县| 调兵山市| 潼南县| 绩溪县| 广饶县| 东光县| 肥东县| 莱阳市| 明水县| 东光县| 斗六市| 亚东县| 津市市| 宁武县| 墨脱县| 新巴尔虎右旗| 福鼎市| 南雄市| 武冈市| 呼和浩特市| 建瓯市| 桓台县| 察雅县| 新巴尔虎右旗| 游戏| 仙游县| 曲阜市| 乌拉特中旗| 绵阳市| 侯马市| 平山县| 迁西县| 佛冈县| 循化| 卫辉市| 托克逊县| 湖南省| 贵德县| 繁峙县|