相信很多人听说过依赖注入,依赖注入实现的基础条件离不开容器,容器就是用来管理类依赖和注入的,负责服务的管理和解耦组件,最简单的理解我们可以把容器理解成一个超级大、专门存对象的数组。
图1
如图所示调用者通过容器的标示获取到对象实例,图里可以看出来,可以通过::class的方式来获取也可以直接通过对象标示获取实例对象。
IOC是什么?
大家可能都听说过IOC容器,IOC的全称是:(InversionOfControl,反转控制)。
我们来理解一下什么是反转控制,在我们传统编码中我们在类与类之间的依赖通常是我们通过编码的方式new出来对象再传递的,而使用控制反转我们可以把对象的控制权交给容器或者框架去实现。目的是为了让我们不需要硬编码去创建对象,看图1可以知道,容器里面存放着很多对象,当我们要使用的时候可以直接去用。而容器里面的对象不需要我们在代码中编码创建。在需要某个类对象的时候会去容器里面获取对象,如果对象不存在则会自动创建。这就是省略了我们在代码里面去创建对象的过程,由容器去帮我们实现这个创建的过程,这就叫反转控制。一句话总结IOC:把创建对象的控制权转移给容器实现类的实例化。
例如:没有使用IOC的情况下,我们想要创建类
?phpclassSunny{}$sunny=newSunny();
我们需要手动去new一个类,这种情况就是硬编码在代码里面去实现的。
而使用IOC容器的代码则可以这样写。
?phpclassSunny{}$sunny=Container::getBean(Sunny::class);
在容器的内部去帮我们实现这个类,有同学看到这里可能会有疑问,我使用newSunny不是代码写得更短更简单吗?我们看完依赖注入再看一个例子。
依赖注入
现在知道了IOC是什么,那么一个新的问题出来了,我们在创建类的时候有些类的构造方法会需要我们传递参数怎么办?通过IOC的学习我们知道了IOC容器会帮我们解决这个对象实例创建的问题,那么在容器里面创建对象的时候发现类有其他依赖则会进行依赖查找,容器寻找需要对象的过程,称为DL(DependencyLookup,依赖查找)。而把需要的依赖注入到代码片段中这个称为DI(DependencyInjection,依赖注入)。
例如IOC里面说到的newSunny这个例子。如果在类与类之间有多重依赖。
?phpclassComputer{publicfunctionrun(){echo"编程中....\n";}}classSunny{private$