這篇文章跟大家分享的內容是詳解php中匿名函數和閉包函數,有著一定的參考價值,有需要的朋友可以參考一下
tags:匿名函式閉包函數php閉包函數php匿名函數function use
引言:匿名函數和閉包函數都不是特別高深的知識,但是很多剛入門的朋友卻總是很困惑,因為大家習慣上寫了函數就是用來調用的,匿名函數和閉包函數做什麼用的?
php官方解釋如下:
匿名函數(Anonymous functions),也叫閉包函數(closures),允許暫時建立一個沒有指定名稱的函數。最常用作回呼函數(callback)參數的值。當然,也有其它所應用的情況。
這裡說的很簡單,可以用做回呼函數,下面例子就是作為回呼函數的
<?php echo preg_replace_callback('~-([a-z])~', function ($match) { return strtoupper($match[1]); }, 'hello-world'); // 输出 helloWorld ?>
上述例子中,preg_replace_callback 函數需要三個參數,第一個參數是一個正規表示式用來匹配數據,第二個參數是一個函數,第三個參數是需要匹配的字串,也可以像下面這樣寫
<?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取得函數定義時的副作用域變量,不管在何時調用。如果要取得呼叫時的變數值,則需要用引用傳遞。具體怎麼使用就要看什麼使用場景了。
作為回呼函數
//一个我们使用过的例子 <?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; }?>
以上是詳解php中匿名函數與閉包函數的詳細內容。更多資訊請關注PHP中文網其他相關文章!