09
07月
2020
/public/index.php
// 入口文件 <?php ... // 执行应用并响应 Container::get('app')->run()->send();
单例模式获取本类实例化,并调用make方法
/thinkphp/library/think/Container.php
<?php ... /** * 获取容器中的对象实例 * @access public * @param string $abstract 类名或者标识 * @param array|true $vars 变量 * @param bool $newInstance 是否每次创建新的实例 * @return object */ public static function get($abstract, $vars = [], $newInstance = false) { return static::getInstance()->make($abstract, $vars, $newInstance); } /** * 创建类的实例 * @access public * @param string $abstract 类名或者标识 * @param array|true $vars 变量 * @param bool $newInstance 是否每次创建新的实例 * @return object */ public function make($abstract, $vars = [], $newInstance = false) { if (true === $vars) { // 总是创建新的实例化对象 $newInstance = true; $vars = []; } // 第一次进来时 $this->name = [] $abstract = 'app' // 第二次,$abstract = 'think\App' $this->name['think\App']还是不存在的 $abstract = isset($this->name[$abstract]) ? $this->name[$abstract] : $abstract; // 看下注册树中有没有,有的话直接返回注册树中的对象 if (isset($this->instances[$abstract]) && !$newInstance) { return $this->instances[$abstract]; } // 第一次进来 $this->bind['app'] 是存在的 // 第二次进来 $this->bind['think\App']是不存在 直接走else if (isset($this->bind[$abstract])) { $concrete = $this->bind[$abstract]; // $concrete = "think\App"; if ($concrete instanceof Closure) { // think\App类不是闭包 走else $object = $this->invokeFunction($concrete, $vars); } else { // 这时候把别名存入到name中 $this->name['app'] = think\App $this->name[$abstract] = $concrete; // 再次调用make方法 $this->make('think\App', $var, $newInstance); return $this->make($concrete, $vars, $newInstance); } } else { $object = $this->invokeClass($abstract, $vars); // 实例化App类 } if (!$newInstance) { // $this->instances['think\App'] = $object; $this->instances[$abstract] = $object; // App类实例上树 } return $object; } ...