這篇文章跟大家分享的內容是詳解php中匿名函數和閉包函數,有著一定的參考價值,有需要的朋友可以參考一下
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中文網其他相關文章!

php把负数转为正整数的方法:1、使用abs()函数将负数转为正数,使用intval()函数对正数取整,转为正整数,语法“intval(abs($number))”;2、利用“~”位运算符将负数取反加一,语法“~$number + 1”。

实现方法:1、使用“sleep(延迟秒数)”语句,可延迟执行函数若干秒;2、使用“time_nanosleep(延迟秒数,延迟纳秒数)”语句,可延迟执行函数若干秒和纳秒;3、使用“time_sleep_until(time()+7)”语句。

php除以100保留两位小数的方法:1、利用“/”运算符进行除法运算,语法“数值 / 100”;2、使用“number_format(除法结果, 2)”或“sprintf("%.2f",除法结果)”语句进行四舍五入的处理值,并保留两位小数。

判断方法:1、使用“strtotime("年-月-日")”语句将给定的年月日转换为时间戳格式;2、用“date("z",时间戳)+1”语句计算指定时间戳是一年的第几天。date()返回的天数是从0开始计算的,因此真实天数需要在此基础上加1。

方法:1、用“str_replace(" ","其他字符",$str)”语句,可将nbsp符替换为其他字符;2、用“preg_replace("/(\s|\ \;||\xc2\xa0)/","其他字符",$str)”语句。

php判断有没有小数点的方法:1、使用“strpos(数字字符串,'.')”语法,如果返回小数点在字符串中第一次出现的位置,则有小数点;2、使用“strrpos(数字字符串,'.')”语句,如果返回小数点在字符串中最后一次出现的位置,则有。

在PHP中,可以利用implode()函数的第一个参数来设置没有分隔符,该函数的第一个参数用于规定数组元素之间放置的内容,默认是空字符串,也可将第一个参数设置为空,语法为“implode(数组)”或者“implode("",数组)”。

php字符串有下标。在PHP中,下标不仅可以应用于数组和对象,还可应用于字符串,利用字符串的下标和中括号“[]”可以访问指定索引位置的字符,并对该字符进行读写,语法“字符串名[下标值]”;字符串的下标值(索引值)只能是整数类型,起始值为0。


熱AI工具

Undresser.AI Undress
人工智慧驅動的應用程序,用於創建逼真的裸體照片

AI Clothes Remover
用於從照片中去除衣服的線上人工智慧工具。

Undress AI Tool
免費脫衣圖片

Clothoff.io
AI脫衣器

AI Hentai Generator
免費產生 AI 無盡。

熱門文章

熱工具

禪工作室 13.0.1
強大的PHP整合開發環境

SublimeText3漢化版
中文版,非常好用

SublimeText3 Linux新版
SublimeText3 Linux最新版

記事本++7.3.1
好用且免費的程式碼編輯器

Dreamweaver CS6
視覺化網頁開發工具