- 首先就是方法注入了。不管在构造方法中还是在普通方法中,通过对变量使用类的类型提示,容器会自动创建一个实例并赋给这个变量,比如一个 Work 类的构造函数:
public function __construct(Service $service) { $this->service = $service ; }
这种方式使用的局限性就是这个 Work 消费类不可以使用 new 关键字创建实例,不能用
new Work()
,必须使用容器的依赖注入。 - 使用容器的 make 方法,这个就是解决上面这个问题的。有的时候我们使用外部包,这个包对 Work 有个依赖,他需要一个 Work 的实例,但是 work 包对 Service 又有依赖,你也不能随便把包改成依赖注入,这个时候可以改造 Work 类:
public function __construct() { $this->service = app(Service::class); }
这个时候就可以通过 new 创建一个 Work 的实例并传入到包中。
- 第三个就是通过服务提供者注册一些特别的绑定;一般来说如果你的类不需要通过接口或者 alias 来注入的话,就没必要在服务提供者里面注册,因为容器解析实例的过程是先查找容器中的实例和服务提供者里面的绑定,如果查找不到就会自动使用 new 关键字创建。
容器里面存储的实际上是一些 key=>value 的数组。其中 key 就是我们在方法注入的类型提示或者 make () 方法中的参数,实际上就是一个字符串。value 代表的是实际上实例化的类。
<