php里的依赖注入概念如何理解好呢?

  1. 昨晚看了下个laravel框架的教学视频. 发现控制器里经常出现function xx (Request, $request)这种写法.
  2. 视频里面的老师, 并没有讲为什么需要进行这样一部操作? 感觉他是习惯性的, 自然而然的, 下意识地会加这个东西.
  3. 作为初学者, 有点懵. 怎么理解依赖注入? 什么时候需要用到依赖注入呢?

图片描述

阅读 2.6k
3 个回答

依赖注入,你可以分开理解。拆成,依赖和注入
依赖:就是你现在要用 request 对象的get 方法,所有你必须要先能得到request对象,然后才能使用这个方法。这个就是依赖。
注入:怎么得到request 对象呢?一种是你直接 $request =new Request() 可以得到,这种也称为主动获取,还有一种就是把整个对象当做一个参数传进来,类型你截图这种,然后去使用。这个就是依赖注入,控制反转(IOC)
一般的做法是会在 construct 方法里面直接注入,后面需要的去使用它。
现在的框架设计思想大多会怎么写,可以提高框架的性能,因为只要使用的时候才会实例化。

因为在 Laravel 中,控制器是通过容器去解析的,当把路由对应的控制器方法传递给容器,容器在解析时,会分析方法需要的参数,然后根据参数的类型去通过容器实例化对应类型的对象,如果这个这个类型是一个接口或抽象类,就在容器中寻找绑定,然后对实际绑定的对象进行实例化。

说简单点儿就是容器帮我们 new 了一个实例,然后传参进来,实现的代码解耦。

在控制器方法中,还有路由参数的传入,这一步由路由解析器完成。

如何理解 Laravel 和 ThinkPHP 5 中的服务容器与注入? - 开发中的一些奇技淫巧 - SegmentFault 思否

依赖注入两个关键

  1. IOC容器,管理需要注入的实例以及依赖关系
  2. 被注入的类不能被程序员手动实例化

像你说的Laravel这里,Controller是由IOC容器实例化的(你没有new过controller对吧)。然后通过反射读取方法的参数列表,如果读取到的type是class,则去IOC容器查询有没有改实例,如果没有,实例化之后注入

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题
宣传栏