本篇文章給大家分享的內容是詳解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獲取函數定義時的副作用域變量,不管在何時調用。如果要獲取調用時的變量值,需要用引用傳遞。具體怎么使用就要看什么使用場景了。
列舉了幾種常用的場景作為回調函數
//一個我們使用過的例子<?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;}?>
如果是一次性使用的函數,不能被重用,可以使用閉包函數
使用array_work()函數配合匿名函數來減少foreach層數
等等
以上就是詳解php中匿名函數和閉包函數的詳細內容,更多請關注 其它相關文章!
鄭重聲明:本文版權歸原作者所有,轉載文章僅為傳播更多信息之目的,如作者信息標記有誤,請第一時間聯系我們修改或刪除,多謝。
新聞熱點
疑難解答