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

首頁 > 語言 > PHP > 正文

thinkphp5.1框架中容器(Container)和門面(Facade)的實現方法分析

2024-05-05 00:10:45
字體:
來源:轉載
供稿:網友

本文實例講述了thinkphp5.1框架中容器(Container)和門面(Facade)的實現方法。分享給大家供大家參考,具體如下:

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

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

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

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

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

// 在框架目錄下的base.php文件// 注冊核心類到容器Container::getInstance()->bind([  'app'          => App::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 mixed */public 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 mixed */public 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 object */protected 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 這個標識// 在容器的make方法中,根據config標識,找到綁定的 think/Config 類,并調用其動態方法 get。facade/Config::get('app_debug');// 最后調用的是:(new think/Config())->get('app_debug');

簡而言之,門面的實現是通過PHP的魔術方法 __callStatic,再配合容器來實現動態類的靜態化調用。

希望本文所述對大家基于ThinkPHP框架的PHP程序設計有所幫助。


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

圖片精選

亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
亚洲一区免费网站| 国产精品私拍pans大尺度在线| 最近中文字幕mv在线一区二区三区四区| 国产69久久精品成人看| 日韩性xxxx爱| 久久久久久香蕉网| 色综合久久天天综线观看| 成人av在线网址| 国产欧美日韩专区发布| 国产婷婷97碰碰久久人人蜜臀| 国产亚洲日本欧美韩国| 一区二区三区视频免费在线观看| 国产日韩综合一区二区性色av| 亚洲成**性毛茸茸| 国产精品久久久久久久久免费| 亚洲老板91色精品久久| 国产精品香蕉在线观看| 成人欧美一区二区三区在线| 91大神福利视频在线| 亚洲成人黄色在线| 57pao国产精品一区| 尤物九九久久国产精品的特点| 欧美巨大黑人极品精男| 日韩av一区二区在线观看| 成人亚洲激情网| 日韩精品久久久久久福利| 色爱av美腿丝袜综合粉嫩av| 韩国一区二区电影| 91国内揄拍国内精品对白| 国产精品久久久久久久美男| 日韩av最新在线观看| 久久综合亚洲社区| 亚洲人精品午夜在线观看| 91免费版网站入口| 亚洲国产精品99久久| 国产成人精品网站| 国产精品狠色婷| 美日韩精品免费观看视频| 92裸体在线视频网站| 久久久久国产一区二区三区| 九九精品在线播放| 亚州国产精品久久久| 美日韩精品视频免费看| 欧美丰满老妇厨房牲生活| 日韩中文在线视频| 亚洲精品有码在线| 深夜福利91大全| 久久精品2019中文字幕| 亚洲国产成人爱av在线播放| 欧美韩日一区二区| 亚洲人成电影在线观看天堂色| 久精品免费视频| 亚洲欧美精品一区二区| 久久久久久综合网天天| 日本韩国在线不卡| 欧美高清在线观看| 日韩欧美国产激情| 91亚洲国产成人精品性色| 国产精品白丝av嫩草影院| 国产亚洲免费的视频看| 精品国产欧美一区二区三区成人| 69av成年福利视频| 国产精品天天狠天天看| 日韩在线视频中文字幕| 精品国内亚洲在观看18黄| 亚洲图片欧美午夜| 欧美高清激情视频| 疯狂做受xxxx欧美肥白少妇| 国产精品美女免费看| 国产一区二区三区在线观看视频| 欧美日韩国产va另类| 亚洲国产日韩欧美在线动漫| 黑人欧美xxxx| 成人激情在线观看| 久久久久亚洲精品成人网小说| 亚洲视频在线观看| 欧美精品久久久久久久| 欧美性一区二区三区| 久久综合伊人77777尤物| 亚洲影视中文字幕| 大桥未久av一区二区三区| 欧美精品videossex性护士| 91丨九色丨国产在线| 国产精品美女在线观看| 黑人巨大精品欧美一区二区三区| 日韩精品中文在线观看| 亚洲精品日产aⅴ| 国产成人福利视频| 国外色69视频在线观看| 激情成人在线视频| 日韩精品久久久久久久玫瑰园| 国产亚洲在线播放| 国产一区二区视频在线观看| 日韩欧美一区二区三区久久| 亚洲精品videossex少妇| 欧美日韩国产在线看| 亚洲午夜精品久久久久久久久久久久| 成人激情视频免费在线| 成人网中文字幕| 北条麻妃在线一区二区| 日韩欧美国产免费播放| 亚洲最大在线视频| 欧美一级淫片丝袜脚交| xxxxxxxxx欧美| 亚洲www在线| 91视频88av| 欧美性xxxx极品hd满灌| 亚洲激情国产精品| 亚洲美女喷白浆| 国产做受高潮69| 欧美日韩成人精品| 亚洲国产成人在线视频| 日韩欧美亚洲国产一区| 国产成人在线一区| 国产精品久久久久久久一区探花| 亚洲成年人在线播放| 日韩在线欧美在线| 亚洲成色999久久网站| 国产精品永久免费视频| 成人免费看吃奶视频网站| 欧美疯狂xxxx大交乱88av| 色综合视频一区中文字幕| 久久久亚洲影院| 日韩欧美在线观看视频| 在线播放日韩精品| 日韩中文字幕在线播放| 日韩av大片免费看| 亚洲毛片在线观看.| 亚洲直播在线一区| 欧美精品在线播放| 亚洲精品美女在线观看播放| 国产精品久久中文| 黑人巨大精品欧美一区免费视频| 38少妇精品导航| 国模吧一区二区三区| 亚洲免费成人av电影| 欧美日产国产成人免费图片| 日韩精品在线播放| 欧美激情女人20p| 精品视频在线观看日韩| 青青青国产精品一区二区| 日韩欧美国产高清91| 精品伊人久久97| 久久777国产线看观看精品| 欧美日韩激情美女| 日本精品一区二区三区在线| 精品国产老师黑色丝袜高跟鞋| 亚洲无限乱码一二三四麻| 日韩精品久久久久久久玫瑰园| 久久亚洲一区二区三区四区五区高| 最近日韩中文字幕中文| 97国产在线视频| 亚洲免费精彩视频| 午夜精品福利在线观看| 中文字幕日韩在线视频| 精品久久香蕉国产线看观看亚洲| 欧美日韩爱爱视频| 精品国产91久久久久久老师| 欧美日韩另类视频| 日韩亚洲欧美中文高清在线| 亚洲一区二区久久| 少妇高潮久久久久久潘金莲| 成人黄色片网站| 亚洲天堂视频在线观看|