为了账号安全,请及时绑定邮箱和手机立即绑定

在线等!如何理解ThinkPHP框架里的依赖注入?

在线等!如何理解ThinkPHP框架里的依赖注入?

慕姐8265434 2019-08-30 01:35:38
今天突然又一次在控制器中看到下面这样的代码,laravel中也有.publicfunctiongetReqInfo(Request$request){代码}先说自己目前的认知和疑问:依赖输入是一种设计模式,实质是把一个类不可能更换的部分和可更换的部分分离开来,通过注入的方式来使用,从而达到解耦的目的.这不是有些类似trait吗?不是相当于在类A中使用类B里的方法吗?有多种实现方式,最常见的先引入,实例化,再调用.通过依赖注入调用其他类以及类里的方法,和其它调用方式有什么区别呢?上述代码里,方法后所传入的参数Request,这个作用是类似强类型语言里的限定类型,表示限定在Request类下$request,表示限定在Request类下的$request对象?该怎么正确理解解依赖注入呢?有没有什么通俗易懂的例子或者表述?
查看完整描述

2 回答

?
莫回无

TA贡献1865条经验 获得超7个赞

首先,你这个理解方式就不是很对。
依赖注入的主要目的就是代码解耦,提高代码的可用性,单一性,以及可测试性。
但是你提问中的栗子,还涉及到了有依赖注入衍生出的另一个知识「依赖注入容器」。
publicfunctiongetReqInfo(Request$request){
//TODO
}
在这里,因为你这个控制器实例是由容器来创建的,对应的方法实现也是由依赖注入来进行处理的,当分析到getReqInfo这个方法时,第一个参数的参数类型是一个用户参数类型,但是,在依赖注入容器中,这里并不限于类型这个可以是一个接口(Interface)。
在容器创建之初或者运行时,将接口对应的实体类绑定(bind)到容器内。
如果没有这个当使用容器处理这个方法时,会先在容器中寻找这个参数类型是否有对应的绑定,如果有就调用绑定的实体,如果没有,就判断其是否是一个可以实例化的类,并处理将其作为参数注入。
在容器中,这一切都是由容器自己去完成的。
再说Trait,Trait的主要目的是用于代码复用,和依赖注入的点并不一致,不知道你是怎么会像这样想。
当依赖注入单独出现时,这个代码可能并不是那么的优雅,但是当容器出现时,这一切就变了。
关于栗子,你可以看我的一篇文章,虽然写的不是很好,兴许能帮助你理解。
如何理解Laravel和ThinkPHP5中的服务容器与注入?-开发中的一些奇技淫巧-SegmentFault思否
                            
查看完整回答
反对 回复 2019-08-30
  • 2 回答
  • 0 关注
  • 471 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信