### :-: **iThink里的依赖注入实现**
**在序言中笔者曾提及iThink拥有一套自定义的依赖注入机制,利用这套机制,可以使我们在开发的过程中十分方便的拿到各种层级的实例,只要可以通过model函数调用得到的对象,都可以通过调用一个属性得到,这里我们深入解读一下这套机制的实现原理。**
> ![](https://box.kancloud.cn/b150e47a76a0ef71815a2275e15de200_681x175.png)
> ![](https://box.kancloud.cn/5368bead232d8281034dc3561a334a72_708x274.png)
观察打印出来的结果,2411 行和 2422 行用两个不同的方式都得到了 app\common\logic\Config 这个对象,用全等比较,返回的是 treu。使用的 model函数方式实例化模型大家一定很熟悉,那么上面的 $this->logic__common_Config 是怎么得到这个模型的?
这里需要两个知识点,一个是__get 方法的原理,一个是trait的使用
在一个类中调用他不存在的属性时,他会自动调用 __get 方法,将调用的属性做参数传入,由我们自行编写处理的逻辑,利用这个机制,我们就可以实现一套依赖注入的机制了
我们请求这个方法
![](https://box.kancloud.cn/a87e1e14e0a00f9f56c7295269211345_801x208.png)
将请求断点设置在2411行,当我在断点处让代码继续执行时,由于前面没有定义这个 logic__common_Config 属性,毫无疑问代码会走到 __get 方法里去,因此,我们在基类里定义了 __get 方法,跟进
![](https://box.kancloud.cn/ae6b13303fa32013281a557a6b6ce2f4_1188x920.png)
logic__common_Config 会作为参数传入,在 127 行用正则对其进行了解析,解析后的结果为上图的 $result 变量,然后我们对这几个参数进行了重组,在 144 行和 148行进行了计算,得到 $layerName 和 $modelName 两个参数,直接吧这两个参数传入到 model 方法即可得到我们需要的实例,和手动调用 model 得到的结果意义,只不过这个过程被 __get 替我们做了,至此,我们在控制器里就可以直接使用这种方法实例化模型了
其实这个__get方法就是写在 trait 里,而控制器,模型,验证器,等基类都引入了这个 trait,所有在他们里面都可以实现这个机制了
- 序言
- 图片预览
- 诠释高效开发
- 提问的智慧
- GIT命令参考
- 安装composer
- 断点调试技巧
- 调试环境的搭建
- 调试工具的使用及技巧
- 前置基础-TP底层讲解
- 理解编程的抽象
- 耦合与解耦
- 自动加载
- 反射类
- 控制反转(IOC)和依赖注入(DI)
- iThink 自定义依赖注入的实现
- 常用设计模式
- SPL标准库
- 行为-钩子-插件
- AOP-面向切面
- RBAC和Auth类的本质
- 安装iThink
- 环境要求
- 代码下载与环境配置
- 执行安装
- 体验测试模块
- apache配置
- nginx配置
- 系统架构详解
- 目录详解
- 执行流程图
- 数据字典
- RBAC 权限管理架构
- 系统分层详解
- 控制器层(controller)
- 逻辑层(logic)
- 视图层(view)
- 模型层(model)
- 服务层(service)
- 应用包架构详解
- 目录结构
- 开发规范
- 数据库规范
- 编码规范
- 功能设计原则与规范
- 后台功能详解
- 基础功能
- RBAC + Auth 权限机制
- 应用化功能机制
- 代码生成器(重要)
- 应用骨架代码生成
- 数据表 CURD 代码生成
- 页面构造器(重要)
- 通用元素构造器
- 表格元素构造器
- 搜索表单元素构造器
- 表单元素构造
- 闭包事物构造器
- 应用的开发
- 函数参考