首頁 >後端開發 >php教程 >詳解php中匿名函數與閉包函數

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

零到壹度
零到壹度原創
2018-04-11 17:53:073111瀏覽

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

php的匿名函數與閉包函數


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


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

匿名函數

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

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

<?php
echo preg_replace_callback(&#39;~-([a-z])~&#39;, function ($match) {
    return strtoupper($match[1]);
}, &#39;hello-world&#39;);
// 输出 helloWorld
?>

上述例子中,preg_replace_callback 函數需要三個參數,第一個參數是一個正規表示式用來匹配數據,第二個參數是一個函數,第三個參數是需要匹配的字串,也可以像下面這樣寫

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

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

閉包函數

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 = &#39;白菜半棵、__2__鲍菇两只、__0__一根,__1__两根,三者比例为100:100:15,酱油5克,香油2克,盐1克。&#39;;//        $mapping = array(//            0 =>array(&#39;name&#39; => &#39;胡萝卜&#39;,&#39;id&#39; =>  &#39;81&#39; ),//            1 =>array ( &#39;name&#39; => &#39;萝卜&#39;, &#39;id&#39; =>  &#39;72&#39;),//            2 =>array ( &#39;name&#39; =>  &#39;杏&#39;, &#39;id&#39; => &#39;1841&#39;)//        );
        if(empty($str) || empty($mapping)){        return false;
        }    $strNew = preg_replace_callback(&#39;"|__(\d)__|" &#39;,function ($matches) use ($mapping){
            return $mapping[$matches[1]][&#39;name&#39;];
        },$str);    $this->log(&#39;拼接后的食材字符串&#39;,$strNew);    return $strNew;
    }?>
#####################################################如果是一次性使用的函數,不能被重複使用,可以使用閉包函數################使用array_work()函數配合匿名函數來減少foreach層數##### #######等等##########

以上是詳解php中匿名函數與閉包函數的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn