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

首頁 > 編程 > PHP > 正文

什么是容器(Container)和門面(Facade)?thinkphp5.1中容

2020-03-22 19:06:33
字體:
來源:轉載
供稿:網友
本篇文章給大家帶來的內容是關于什么是容器(Container)和門面(Facade)?thinkphp5.1中容器和門面的淺析,有一定的參考價值,有需要的朋友可以參考一下,希望對你有所幫助。

p5.1中引入了容器(Container)和門面(Facade)這兩個新的類

官方文檔已經給出了定義:

容器(Container)實現類的統一管理,確保對象實例的唯一性。

門面(Facade)為容器(Container)中的類提供了一個靜態調用接口,相比于傳統的靜態方法調用, 帶來了更好的可測試性和擴展性,你可以為任何的非靜態類庫定義一個facade類。

深入源碼,我們來看看它到底是如何實現的:

// 在框架目錄下的base.php文件// 注冊核心類到容器Container::getInstance()- bind([ app = App::html' target='_blank'>class, build = Build::class, cache = Cache::class, config = Config::class,// 注冊核心類的靜態代理Facade::bind([ facade/App::class = App::class, facade/Build::class = Build::class, facade/Cache::class = Cache::class, facade/Config::class = Config::class,// 注冊類庫別名Loader::addClassAlias([ App = facade/App::class, Build = facade/Build::class, Cache = facade/Cache::class, Config = facade/Config::class,]);

容器實現:

這里,框架已經幫我們綁定了系統常用類到容器中,在之后使用時,只需要調用助手函數 app()進行容器中的類解析調用,對于已經綁定的類標識,會自動快速實例化。

// 實例化緩存類app( cache // app( cache , [ file 參數化調用// 相當于執行了Container::get( cache // 查看源碼,Container調用的其實是make方法,在該方法里調用反射等實現類的實例化,過程如下:
public function make($abstract, $vars = [], $newInstance = false) if (true === $vars) { // 總是創建新的實例化對象 $newInstance = true; $vars = []; if (isset($this- instances[$abstract]) !$newInstance) { $object = $this- instances[$abstract]; } else { if (isset($this- bind[$abstract])) { $concrete = $this- bind[$abstract]; // 閉包實現 if ($concrete instanceof /Closure) { $object = $this- invokeFunction($concrete, $vars); } else { $object = $this- make($concrete, $vars, $newInstance); } else { // 反射實現 $object = $this- invokeClass($abstract, $vars); if (!$newInstance) { $this- instances[$abstract] = $object; return $object;}
/** * 調用反射執行類的實例化 支持依賴注入 * @access public * @param string $class 類名 * @param array $vars 變量 * @return mixedpublic function invokeClass($class, $vars = []) $reflect = new /ReflectionClass($class); $constructor = $reflect- getConstructor(); if ($constructor) { $args = $this- bindParams($constructor, $vars); } else { $args = []; return $reflect- newInstanceArgs($args);}
/** * 執行函數或者閉包方法 支持參數調用 * @access public * @param string|array|/Closure $function 函數或者閉包 * @param array $vars 變量 * @return mixedpublic function invokeFunction($function, $vars = []) $reflect = new /ReflectionFunction($function); $args = $this- bindParams($reflect, $vars); return $reflect- invokeArgs($args);}

簡而言之,容器內部是通過反射類或閉包等來實現類的實例化。

門面實現:

以一個例子來分析:

facade/Config::get( app_debug 

我們來分析一下它的實現方式:

// thinkphp/library/facade/Config 類
namespace think/facade;use think/Facade;class Config extends Facade}

// 從源代碼上看 Config本身沒有任何方法,它繼承了Facade的方法,但Facade并沒有get這個靜態方法
// 此時,系統自動觸發了魔術方法:__callStatic(),Facade重寫了此方法:

public static function __callStatic($method, $params) return call_user_func_array([static::createFacade(), $method], $params);}

// 可見,最后調用的是用戶自定義函數:call_user_func_array([實例, 方法], 參數),為了獲得Config實例,Facade又定義了一個獲取對象的方法:

/** * 創建Facade實例 * @static * @access protected * @param string $class 類名或標識 * @param array $args 變量 * @param bool $newInstance 是否每次創建新的實例 * @return objectprotected static function createFacade($class = , $args = [], $newInstance = false) $class = $class ?: static::class; $facadeClass = static::getFacadeClass(); if ($facadeClass) { $class = $facadeClass; } elseif (isset(self::$bind[$class])) { $class = self::$bind[$class]; if (static::$alwaysNewInstance) { $newInstance = true; return Container::getInstance()- make($class, $args, $newInstance);}

// 其內部是通過容器來實例化對象
// 因為在base.php中已經將 think/Config 類綁定到 config 這個標識

Container::getInstance()- bind([ config = Config::class// 在 createFacade 方法中,獲取類的名稱:$class = $class ?: static::class; 即得到 config 這個標識        

鄭重聲明:本文版權歸原作者所有,轉載文章僅為傳播更多信息之目的,如作者信息標記有誤,請第一時間聯系我們修改或刪除,多謝。

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
日韩欧美国产激情| 91高清视频免费| 亚洲无限乱码一二三四麻| 色悠悠国产精品| 中文字幕精品在线| 日韩精品在线视频观看| 亚洲精品美女久久久久| 久久久久久久一区二区三区| 欧美成人一区二区三区电影| 国产精品久久在线观看| 久久精品国产一区二区三区| 欧美老肥婆性猛交视频| 日韩乱码在线视频| 91精品久久久久久久久久久久久| 岛国视频午夜一区免费在线观看| 欧美怡红院视频一区二区三区| 一个人看的www久久| 91精品国产亚洲| 国产精品久久久久久久久粉嫩av| 91色中文字幕| 欧美日韩中文字幕综合视频| 日日骚久久av| 精品视频在线观看日韩| 亚洲毛茸茸少妇高潮呻吟| 在线电影欧美日韩一区二区私密| 久久久精品日本| 中文字幕无线精品亚洲乱码一区| 中文字幕日韩免费视频| 亚洲一区二区免费在线| 日韩成人在线网站| 精品成人乱色一区二区| 国产欧美va欧美va香蕉在| 色老头一区二区三区| 欧美电影在线免费观看网站| 欧美激情亚洲一区| 日韩成人在线免费观看| 精品国产一区久久久| 91精品国产99久久久久久| 亚洲欧美日韩久久久久久| 亚洲国产精彩中文乱码av| 不卡中文字幕av| 国产成人黄色av| 亚洲欧美日本精品| 国产成人午夜视频网址| 久久久之久亚州精品露出| 久久成人这里只有精品| 久久综合久中文字幕青草| 国产精品久久9| 国产精品久久久久久久久久久久久| 伊人久久精品视频| 久久免费成人精品视频| 另类色图亚洲色图| 国产成人精品av| 日韩小视频在线观看| 精品久久久久久久久国产字幕| 亚洲高清免费观看高清完整版| 成人黄色免费在线观看| 国产精品视频精品| 久久久这里只有精品视频| 国产精品成人一区二区| 97激碰免费视频| 欧美一级bbbbb性bbbb喷潮片| 久久中文字幕在线| 日韩av在线免费观看一区| 国产亚洲精品美女久久久| 日日摸夜夜添一区| 久久久久久久影院| 中文字幕日韩专区| 不卡在线观看电视剧完整版| 91免费观看网站| 国产精品第二页| 日本高清视频一区| 国产精品www网站| 78m国产成人精品视频| 欧美日韩午夜激情| 国产精品h片在线播放| 91精品在线观| 国产精品高潮视频| 激情成人在线视频| 都市激情亚洲色图| 欧美成人午夜剧场免费观看| 亚洲精品成人av| 97免费视频在线播放| 日韩在线视频二区| 韩国三级电影久久久久久| 91精品国产高清自在线看超| 91精品国产91久久久久久久久| 亚洲欧美精品在线| 亚洲美女在线视频| 日韩免费在线视频| 91久久在线视频| 日韩免费精品视频| 欧美一区二区三区免费视| 亚洲福利影片在线| 欧美日韩成人在线播放| 久热国产精品视频| 日本久久久a级免费| 欧美人在线观看| 欧美激情亚洲自拍| 欧美午夜视频在线观看| 国内精品小视频在线观看| 国产精品视频中文字幕91| 日韩欧美福利视频| 亚洲欧美精品中文字幕在线| 97精品国产97久久久久久| 久久99国产精品自在自在app| 亚洲黄页视频免费观看| 人人爽久久涩噜噜噜网站| 日韩欧美中文字幕在线播放| 欧美极品第一页| 热久久这里只有精品| 日韩av在线免播放器| 亚洲第一偷拍网| 疯狂做受xxxx欧美肥白少妇| www.99久久热国产日韩欧美.com| 欧美成人在线网站| 国产一区二区视频在线观看| 日韩va亚洲va欧洲va国产| 日韩av电影手机在线| 久久久999国产精品| 国产不卡av在线免费观看| 日韩电视剧在线观看免费网站| 亚洲国产又黄又爽女人高潮的| 日韩成人高清在线| 欧美一区二区视频97| 欧美理论电影在线观看| 欧美理论片在线观看| 秋霞午夜一区二区| 国产亚洲精品91在线| 中文日韩在线视频| 九九热视频这里只有精品| 欧美裸体xxxxx| 亚洲成人激情小说| 日韩一区二区av| 成人免费看吃奶视频网站| 亚洲美女性视频| 欧美大肥婆大肥bbbbb| 亚洲xxx视频| 亚洲精品国精品久久99热一| 欧美日韩国产一区二区三区| 国产精品久久久久久久久男| 高潮白浆女日韩av免费看| 国产在线一区二区三区| 亚洲福利在线播放| 精品小视频在线| 欧美日产国产成人免费图片| 日韩最新中文字幕电影免费看| 欧美日韩国产专区| 91久久精品日日躁夜夜躁国产| 亚洲视频第一页| 欧美精品一区在线播放| 亚洲人成网在线播放| 国产99久久精品一区二区| 8090成年在线看片午夜| 欧洲成人午夜免费大片| 午夜精品久久久久久久久久久久| 91国产精品电影| 成人激情视频在线播放| 日韩风俗一区 二区| 亚洲乱码国产乱码精品精| 国产在线观看91精品一区| 欧美日韩在线第一页| 情事1991在线| 日韩综合中文字幕|