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博客