当前位置: 首页>PHP>正文

ThinkPhp5源碼學習(容器)

ThinkPhp5源碼學習(容器)

Container::get('app')
public static function get($abstract, $vars = [], $newInstance = false)
{return static::getInstance()->make($abstract, $vars, $newInstance);
}

實例化Container類?

public static function getInstance()
{if (is_null(static::$instance)) {static::$instance = new static;}return static::$instance;
}

初始參數為?

protected $instances = [];
protected $bind = ['app'                   => App::class,'build'                 => Build::class,'cache'                 => Cache::class,'config'                => Config::class,'cookie'                => Cookie::class,'debug'                 => Debug::class,'env'                   => Env::class,'hook'                  => Hook::class,'lang'                  => Lang::class,'log'                   => Log::class,'middleware'            => Middleware::class,'request'               => Request::class,'response'              => Response::class,'route'                 => Route::class,'session'               => Session::class,'template'              => Template::class,'url'                   => Url::class,'validate'              => Validate::class,'view'                  => View::class,'rule_name'             => route\RuleName::class,// 接口依賴注入'think\LoggerInterface' => Log::class,];/*** 容器標識別名* @var array*/protected $name = [];

make方法

public function make($abstract, $vars = [], $newInstance = false)
{if (true === $vars) {// 總是創建新的實例化對象$newInstance = true;$vars        = [];}$abstract = isset($this->name[$abstract]) ? $this->name[$abstract] : $abstract;if (isset($this->instances[$abstract]) && !$newInstance) {return $this->instances[$abstract];}if (isset($this->bind[$abstract])) {$concrete = $this->bind[$abstract];if ($concrete instanceof Closure) {$object = $this->invokeFunction($concrete, $vars);} else {$this->name[$abstract] = $concrete;return $this->make($concrete, $vars, $newInstance);}} else {$object = $this->invokeClass($abstract, $vars);}if (!$newInstance) {$this->instances[$abstract] = $object;}return $object;
}

由初始參數可以看出$this->name起始[],$abstact='app',$instances=[],$this->bind['app']返回think\App,$concrete=think\App,think\App不屬于Closure,$this->name['app']=think\App;$this->make(think\App,[],false);

?由上可知$this->name['app'] = think\App,$this->name[think\App]不存在,$abstract=think\App,$instances=[],$this->bind[think\App]不存在,實例化App,返回實例化App對象。

invokeClass鏈接:ThinkPhp5源碼學習(invokeClass反射)_無涯w的博客-CSDN博客

https://www.zydui.com/af1f8U28CAwVRClcG.html
>

相关文章:

  • czj 50 1.8 測試,CZXX 1+X測試
  • 從NeRF到Plenoxels學習 透明度 體積渲染方程
  • ubuntu 20.04安裝教程,Ubuntu-20.04-noetic安裝cartographer100%成功
  • 基于thinkphp+mysql+layerui+bootstrap的通訊錄管理系統
  • graphpad怎么改成中文,Graphviz的使用及中文亂碼問題
  • 大數據時代有哪些倫理問題,大數據技術中的倫理問題
  • 手抓餅技術培訓怎么制作手抓餅,制作技術培訓演示文檔(PPT)的一些經驗和建議
  • ipados最新版本,今日,蘋果發布 iPadOS/iOS 13 首個公測版更新
  • 一次發多條朋友圈,微信朋友圈多賬號一步同發圈 | 朋友圈
  • ps在此windows,psservice.exe
  • server和service區別,(三)Server和Service
  • 網絡服務器存儲基礎知識,關于存儲芯片的入門基礎知識
  • 任務和計劃的區別,計劃時間任務
  • 將圖表嵌入工作表,Luckysheet 圖表(chartmix)
  • 超出最大進程數,為什么Linux系統最大進程號是32767
  • c語言%%d,c語言中int(2byte)的表示范圍是為什么是-32768~32767!
  • ORA-32771
  • 平面設計和3d設計區別,平面設計和3D設計哪個好找工作?次世代游戲建模的前景,超出想象!
  • 直線簡筆畫,手繪線條一直畫不直_什么?直線畫不直?戳進來,你會滿載而歸!
  • 3d建模現在前景怎么樣,3D手繪和次世代建模哪個更吃香,個人發展,行業前景,高能預警!
  • css去除文本裝飾,去除文字里的html標簽的C#方法
  • 根據對象名反射出對象,通過反射創建對象
  • 涉密信息系統集成資質類別,關于涉密信息系統集成資質認證問題匯總與解答
  • 帽子設計創意,帽子設計作品——蒸汽朋克的烏托邦,機械配件的幻想世界!
  • 產品經理認證npdp考試,2023年制造業產品經理NPDP認證報名入口及指南
  • 由于以下錯誤,通過 Windows XP Embedded 設備更新代理應用 QFE
  • 數據科學算法PDF下載,CDKF、UKF和EKF濾波算法
  • 濃度商Q計算公式,em算法的Q函數的理解
  • mac安裝win10選哪個版本,送上Mac下最好用的SVN客戶端Versions下載,界面漂亮,絕對好用
  • visualsvn server license key,可以再mac上使用的svn客戶端-----試驗成功可用