亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 語言 > PHP > 正文

淺談PHP匿名函數和閉包

2024-05-05 00:07:17
字體:
來源:轉載
供稿:網友

概述

閉包和匿名函數在PHP 5.3.0中引入,這兩個特性非常有用,每個PHP開發者都應該掌握。

匿名函數其實就是沒有名稱的函數,匿名函數可以賦值給變量,還能像其他任何PHP函數對象那樣傳遞。不過匿名函數仍然是函數,因此可以調用,還可以傳入參數,適合作為函數或方法的回調。

閉包是指在創建時封裝周圍狀態的函數,即使閉包所在的環境的不存在了,閉包中封裝的狀態依然存在。

創建匿名函數

創建匿名函數很簡單:

//將匿名函數賦給一個變量,通過變量名+()的形式來調用$greet = function () { return "Hello World";};echo $greet();

結果打印:

Hello World

匿名函數和普通的PHP函數很像:常用的句法相同,也接受參數,而且能返回值。不過閉包沒有函數名。

注:我們之所以能調用$greet變量,是因為這個變量的值是一個閉包,而且閉包對象實現了__invoke()魔術方法,只要變量名后有(),PHP就會查找并調用__invoke方法。

我們通常把匿名函數當做函數或方法的回調使用,事實上,很多PHP函數都會用到匿名函數,比如array_mappreg_replace_callback,這是使用PHP匿名函數的絕佳時機。記住,閉包和其他值一樣,可以作為參數傳入其他PHP函數:

$numberPlusOne = array_map(function ($number) { return $number += 1;}, [1, 2, 3]);print_r($numberPlusOne);

在匿名函數出現之前,要實現這樣的功能,PHP開發者只能單獨創建具名函數,然后使用名稱引用這個函數:

function incrementNumber ($number) { return $number += 1;}$numberPlusOne = array_map(‘incrementNumber', [1, 2, 3]);print_r($numberPlusOne);

這樣做把回調的實現和使用場所隔離開了,而且使用閉包實現代碼更加簡潔。

創建閉包

包含自由變量的函數與為所有這些自由變量提供了變量綁定的環境一起,被稱為閉包。

function makeHelloWorld($name) {  $i = 0; return function()use($name, &$i){  echo $name.$i. ' <br>';  $i++; };}$hello1 = makeHelloWorld("itbsl");$hello2 = makeHelloWorld("kevin");$hello1();$hello1();$hello1();$hello2();

打印結果:

itbsl0 
itbsl1 
itbsl2 
kevin0

從父作用域繼承變量

在PHP中必須手動調用閉包對象的bindTo方法或使用use關鍵字把父作用域的變量及狀態附加到PHP閉包中。而實際應用中,又以使用use關鍵字實現居多。

use關鍵字

實際上,Laravel框架中也大量使用了閉包,最常見的比如路由定義:

Route::group(['domain' => '{account}.myapp.com'], function () { Route::get('user/{id}', function ($account, $id) {  // });});

這里面的兩個function都是匿名函數。而從父作用域繼承變量的使用場景在Laravel底層源碼中也是俯拾即是,比如Model.php(Illuminate/Database/Eloquent)的saveOrFail方法:

 

PHP,匿名函數,閉包
 

 

該方法的作用是使用事務將模型數據保存到數據庫,這里面我們使用匿名函數返回保存狀態,同時使用use關鍵字將父作用域的$options傳遞給該閉包以便其能夠訪問這個數據。

此外,還支持傳遞多個父作用域變量到匿名函數,比如還是在Model類中的forceFill方法:

 

PHP,匿名函數,閉包

 

多個變量以逗號分隔即可。

bindTo方法

我們在前面已經提到,閉包是一個對象,所以我們可以在閉包中使用$this關鍵字獲取閉包的內部狀態,閉包對象的默認狀態沒什么用,需要注意的是其中的__invoke魔術方法和bindTo方法。

__invoke的作用前面已經說過,當嘗試以調用函數的方式調用一個對象時,__invoke() 方法會被自動調用。

接下來我們來看看bindTo方法,通過該方法,我們可以把閉包的內部狀態綁定到其他對象上。這里bindTo方法的第二個參數顯得尤為重要,其作用是指定綁定閉包的那個對象所屬的PHP類,這樣,閉包就可以在其他地方訪問邦定閉包的對象中受保護和私有的成員變量。

你會發現,PHP框架經常使用bindTo方法把路由URL映射到匿名回調函數上,框架會把匿名回調函數綁定到應用對象上,這樣在匿名函數中就可以使用$this關鍵字引用重要的應用對象:

class App { protected $routes = []; protected $responseStatus = '200 OK'; protected $responseContentType = 'text/html'; protected $responseBody = 'Laravel學院'; public function addRoute($routePath, $routeCallback) {  $this->routes[$routePath] = $routeCallback->bindTo($this, __CLASS__); } public function dispatch($currentPath) {  foreach ($this->routes as $routePath => $callback) {   if( $routePath === $currentPath) {    $callback();   }  }  header('HTTP/1.1 ' . $this->responseStatus);  header('Content-Type: ' . $this->responseContentType);  header('Content-Length: ' . mb_strlen($this->responseBody));  echo $this->responseBody; }}

這里我們需要重點關注addRoute方法,這個方法的參數分別是一個路由路徑和一個路由回調,dispatch方法的參數是當前HTTP請求的路徑,它會調用匹配的路由回調。第9行是重點所在,我們將路由回調綁定到了當前的App實例上。這么做能夠在回調函數中處理App實例的狀態:

$app = new App();$app->addRoute(‘user/nonfu', function(){ $this->responseContentType = ‘application/json;charset=utf8'; $this->responseBody = ‘{“name”:”LaravelAcademy"}';});$app->dispatch(‘user/nonfu');在Larval底層也有用到bindTo方法,詳見Illuminate/Support/Traits/Macroable的__call方法:

以上所述是小編給大家介紹的PHP匿名函數和閉包詳解整合,希望對大家有所幫助,如果大家有任何疑問請給我留言,小編會及時回復大家的。在此也非常感謝大家對VeVb武林網網站的支持!


注:相關教程知識閱讀請移步到PHP教程頻道。
發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表

圖片精選

亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
欧美在线视频一区二区| 亚洲国产精品女人久久久| 欧美理论片在线观看| 亚洲精品国产综合久久| 亚洲精品久久视频| 色综合导航网站| 青青草原一区二区| 日韩精品免费视频| 亚洲社区在线观看| 欧美自拍视频在线观看| 亚洲精品电影在线| 欧美老肥婆性猛交视频| 成人精品一区二区三区电影黑人| 国产精品网址在线| 欧美性理论片在线观看片免费| 欧美与欧洲交xxxx免费观看| 精品少妇v888av| 日韩免费看的电影电视剧大全| 日韩精品视频观看| 91欧美激情另类亚洲| 欧美黑人又粗大| 欧美日韩成人在线观看| 欧美视频精品一区| 中文字幕在线看视频国产欧美| 国产噜噜噜噜噜久久久久久久久| xxxxxxxxx欧美| 国产91精品青草社区| 一区二区三区四区精品| 77777亚洲午夜久久多人| 欧美日韩一区二区精品| 欧美高跟鞋交xxxxxhd| 成人av色在线观看| 亚洲人成在线观看| 色悠悠国产精品| 在线观看精品国产视频| 精品亚洲国产视频| 亚洲成人亚洲激情| 欧美成人精品在线| 亚洲人成在线免费观看| 欧美大片欧美激情性色a∨久久| 成人伊人精品色xxxx视频| 欧美久久精品午夜青青大伊人| 国产成人精品最新| 欧美一区视频在线| 日韩免费黄色av| 成人日韩在线电影| 最近2019中文字幕一页二页| 亚洲石原莉奈一区二区在线观看| 欧美成人一区二区三区电影| 在线观看不卡av| 97在线视频免费观看| 欧美成人国产va精品日本一级| 国产91在线视频| 51视频国产精品一区二区| 欧美日韩国产va另类| 国产欧美亚洲精品| 国产欧美最新羞羞视频在线观看| 久久综合色88| 久久久国产91| 精品国产成人av| 久久大大胆人体| 久久香蕉国产线看观看av| 欧美一区二区三区精品电影| 久久久在线视频| 91视频8mav| 欧美成aaa人片免费看| 国产一区二区三区免费视频| 国产精品对白刺激| 国内精品400部情侣激情| 精品国产电影一区| 亚洲欧美日韩中文在线| 精品久久久久久亚洲国产300| 亚洲欧美在线x视频| 久久伊人免费视频| 国产精品精品视频一区二区三区| 久久欧美在线电影| 91久久在线观看| 成人免费淫片aa视频免费| 97视频在线观看播放| 国产综合久久久久久| 国外成人在线播放| 亚洲第一精品福利| 日韩免费在线电影| 欧美成人剧情片在线观看| 91视频国产高清| 国产亚洲视频中文字幕视频| 国产色视频一区| 57pao成人永久免费视频| 欧美日韩性视频在线| 中文字幕久久久| 欧美日韩国产在线| 最好看的2019的中文字幕视频| 亚洲高清色综合| 欧美综合第一页| 68精品国产免费久久久久久婷婷| 亚洲第一男人av| 午夜精品一区二区三区在线播放| 亚洲精品在线视频| 国产精品69久久久久| 8050国产精品久久久久久| 午夜精品一区二区三区av| 国产亚洲福利一区| 国产一区二区三区高清在线观看| 久久久久久久久久国产精品| 在线观看日韩欧美| 亚洲色图综合久久| 亚洲人成在线观看网站高清| 永久555www成人免费| 亚洲永久免费观看| 国产精品69av| 欧美一性一乱一交一视频| 国产午夜精品美女视频明星a级| 亚洲福利小视频| 91网在线免费观看| 欧美与欧洲交xxxx免费观看| 亚洲欧美一区二区精品久久久| 精品自在线视频| 国产成人在线一区二区| 精品亚洲一区二区三区在线播放| 精品香蕉一区二区三区| 色无极影院亚洲| 日本精品一区二区三区在线播放视频| 91地址最新发布| 欧美壮男野外gaytube| 欧美国产日韩xxxxx| 最新国产成人av网站网址麻豆| 一本色道久久88亚洲综合88| 亚洲第一男人天堂| 久久久久久久一区二区三区| 国产va免费精品高清在线观看| 亚洲欧洲成视频免费观看| 美日韩在线视频| 国产精品成人va在线观看| 国产丝袜高跟一区| 亚洲美女中文字幕| 亚洲欧美在线看| 国产精品露脸av在线| 亚洲国产成人一区| 在线播放亚洲激情| 亚洲国产91精品在线观看| 综合欧美国产视频二区| 亚洲精品国产综合久久| 播播国产欧美激情| 日韩av影片在线观看| 在线观看日韩www视频免费| 欧美日韩国产精品一区二区三区四区| 91精品国产高清久久久久久久久| 色婷婷亚洲mv天堂mv在影片| 久久久99久久精品女同性| 国产精品人成电影在线观看| 日韩在线中文字| 成人黄色在线观看| 久久久www成人免费精品张筱雨| 国产精品香蕉在线观看| 欧美香蕉大胸在线视频观看| 亚洲国产一区二区三区四区| 91久久国产综合久久91精品网站| 国产精品中文字幕久久久| 国产成人精品优优av| 最新日韩中文字幕| 久久精品国产久精国产思思| 91精品久久久久久久久久入口| 午夜美女久久久久爽久久| 亚洲精品免费网站|