ThinkChat2.0新版上线,更智能更精彩,支持会话、画图、阅读、搜索等,送10W Token,即刻开启你的AI之旅 广告
### :-: **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,所有在他们里面都可以实现这个机制了