如何理解ThinkPHP框架里的依赖注入?

发布于 2022-09-11 21:40:37 字数 562 浏览 38 评论 0

今天突然又一次在控制器中看到下面这样的代码, laravel中也有.

public function getReqInfo(Request $request){
    代码
}

先说自己目前的认知和疑问:

  1. 依赖输入是一种设计模式, 实质是把一个类不可能更换的部分 和 可更换的部分 分离开来,通过注入的方式来使用,从而达到解耦的目的.

    • 这不是有些类似trait吗?
    • 不是相当于在类A中使用类B里的方法吗? 有多种实现方式, 最常见的先引入, 实例化, 再调用.
    • 通过依赖注入调用其他类以及类里的方法, 和其它调用方式有什么区别呢?
  2. 上述代码里, 方法后所传入的参数

    • Request, 这个作用是类似强类型语言里的限定类型, 表示限定在Request类下
    • $request, 表示限定在Request类下的$request对象?
  3. 该怎么正确理解解依赖注入呢? 有没有什么通俗易懂的例子或者表述?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(2

小ぇ时光︴ 2022-09-18 21:40:37

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

trait 的使用一般是为了解决多继承问题.
不是相当于在类A中使用类B里的方法吗? 有多种实现方式, 最常见的先引入, 实例化, 再调用.
是这么理解的,依赖注入也只是一种实现方式。
依赖注入这种方式,可以利用懒加载,使用的时候才会实例化。

public function getReqInfo(Request $request){

代码

}
这样写的话,表示我可以使用 Request 对象的方法,如果我还要使用其它的,可以继续往里加。
public function getReqInfo(Request $request, Response $response){

代码

}

如果你还不清楚的话,可以去看看laravel 官网里面,关于依赖注入的文档

烟燃烟灭 2022-09-18 21:40:37

首先,你这个理解方式就不是很对。

依赖注入的主要目的就是代码解耦,提高代码的可用性,单一性,以及可测试性。

但是你提问中的栗子,还涉及到了有依赖注入衍生出的另一个知识 「依赖注入容器」。

public function getReqInfo(Request $request){
// TODO
}

在这里,因为你这个控制器实例是由 容器 来创建的,对应的方法实现也是由依赖注入来进行处理的,当分析到 getReqInfo 这个方法时,第一个参数的参数类型是一个 用户参数类型 ,但是,在依赖注入容器中,这里并不限于 类型 这个可以是一个接口(Interface)

在容器创建之初或者运行时,将接口对应的实体类绑定(bind)到容器内。

如果没有这个 当使用容器处理这个方法时,会先在容器中寻找这个 参数类型 是否有对应的绑定,如果有就调用绑定的实体,如果没有,就判断其是否是一个可以实例化的类,并处理将其作为参数注入。

在容器中,这一切都是由容器自己去完成的。

再说 Trait , Trait 的主要目的是用于代码复用,和依赖注入的点并不一致,不知道你是怎么会像这样想。

依赖注入单独出现时,这个代码可能并不是那么的优雅,但是当容器出现时,这一切就变了。

关于栗子,你可以看我的一篇文章,虽然写的不是很好,兴许能帮助你理解。

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文