合规国际互联网加速 OSASE为企业客户提供高速稳定SD-WAN国际加速解决方案。 广告
# thinkphp5.1容器流程分析 # (一)容器部分 ## 创建实例流程 Container 1. 容器标识别名 $this->name \[app\]=>think\\App 2. 容器对象实例 $this->instance 3. 容器绑定标识 $this->bind \[app\]=>think\\App 4. 容器中的对象实例 $this->instances \[think\\App\] =>think\\App Object ## 第一次回调 第一次make 以入口文件为例: 1. 先查看容器标识别名 $this->name中是否存在 如果存在就返回别名 不存在就返回app 2. 查看注册树中是否存 $this->instances\[app\]中是否存在值 如果存在就直接返回注册树中的实例 如果没有则跳过这一部分 继续往下执行 3. 从容器绑定的标识中查找 看是否存在 $this->bind\[app\] 存在就把 think\\App赋值给变量 $concrete 在判断变量是不是闭包 肯定不是闭包 所以执行else 4. 就存在了 $this->name\[app\]= think\\App; 然后再递归回调make函数 ## 第二次回调 第二次回调make 第二次make的时候 参数不再是app 而是 think\\App 1. 先查看容器标识别名 $this->name中是否存在 如果存在就返回别名 不存在就返回think\\App 2. 查看注册树中是否存 $this->instances\[think\\App\]中是否存在值 如果存在就直接返回注册树中的实例 如果没有则跳过这一部分 继续往下执行 3. 从容器绑定的标识中查找 看是否存在 $this->bind\[think\\App\] 存在 但是不存在 所以走else 4. 使用$this->invokeClass方法 根据反射 创建一个实例 5. 把创建的实例 存到$this->instances\[\]中 ## 流程图 1. 执行应用并响应 Container::get('app')->run->send(); 2. 会执行 Container::get() 方法 3. 执行 static::getInstance() 返回 Container的实例 4. Container 调用make()方法 第一个参数是App 5. 第一次执行make()方法会返回$this->bind(‘app’)的标识 也就是think\\App 第二次再调用的make()方法是参数就是think\\App 会直接走 $obj = $this->invoClass($abstaract,$vars); 6. 在invokerClass()方法中利用反射机制 会返回对应的实例 7. 最终Container::get(app)就会返回Container的实例