基本概念
1.依赖倒置(反转)原则(DIP):一种软件架构设计的原则(抽象概念,是一种思想)
在面向对象编程领域中,依赖反转原则(Dependency inversion principle,DIP)是指一种特定的解耦(传统的依赖关系创建在高层次上,而具体的策略设置则应用在低层次的模块上)形式,使得高层次的模块不依赖于低层次的模块的实现细节,依赖关系被颠倒(反转),从而使得低层次模块依赖于高层次模块的需求抽象。
该原则规定:
- 1.高层次的模块不应该依赖于低层次的模块,两者都应该依赖于抽象接口。
- 2.抽象接口不应该依赖于具体实现。而具体实现则应该依赖于抽象接口。
在上图中,高层对象A依赖于底层对象B的实现;图2中,把高层对象A对底层对象的需求抽象为一个接口A,底层对象B实现了接口A,这就是依赖反转。
该原则颠倒了一部分人对于面向对象设计的认识方式。如高层次和低层次对象都应该依赖于相同的抽象接口。它转换了依赖,高层模块不依赖于低层模块的实现,而低层模块依赖于高层模块定义的接口。通俗的讲,就是高层模块定义接口,低层模块负责实现。
2.控制反转(IoC):一种反转流、依赖和接口的方式(DIP的具体实现方式,一种设计原则)
控制反转(Inversion of Control,缩写为IoC),是面向对象编程中的一种设计原则,可以用来减低计算机代码之间的耦合度。其中最常见的方式叫做依赖注入(Dependency Injection,简称DI),还有一种方式叫“依赖查找”(Dependency Lookup)。通过控制反转,对象在被创建的时候,由一个调控系统内所有对象的外界实体,将其所依赖的对象的引用传递给它。也可以说,依赖被注入到对象中。
它把传统上由程序代码直接操控的对象的调用权交给容器,通过容器来实现对象组件的装配和管理。所谓的“控制反转”概念就是对组件对象控制权的转移,从程序代码本身转移到了外部容器。
实现控制反转主要有两种方式:
1.依赖注入:
2.依赖查找
Yii2中的依赖注入
相关的类:
- yii\di\Container 容器
- yii\di\instance 容器或Service Locator中的东西: 本质上是对于某一个类实例的引用
- yii\di\ServiceLocator
1.yii\di\instance
主要用在两个地方:
- 1.在配置DI容器的时候,使用Instance来引用一个类名,接口名或者是别名(即Instance的id属性)。因此后续DI容器可以将这个引用解析成相应的对象
- 2.用在那些使用service locator获取依赖对象的类中
1.表示的是容器中的内容,代表的是对于实际对象的引用。
2.DI容器可以通过他获取所引用的实际对象。
3.Instance类仅有的一个属性id一般表示的是实例的类型(即component ID, class name, interface name or alias name)。
2.yii\di\Container
注意:下面所说的“对象类型”的具体定义为“类名,接口名,别名”
对于yiidiContainer
- a) 5个私有属性(都是数组):$_singletons,$_definitions,$_params,$_reflections,$_dependencies
- b) $_singletons // 用于保存单例Singleton对象,以对象类型为键
- c) $_definitions // 用于保存依赖的定义,以对象类型为键
- d) $_params // 用于保存构造函数的参数,以对象类型为键
- e) $_reflections // 用于缓存ReflectionClass对象,以对象类型为键
- f) $_dependencies // 用于缓存依赖信息,以对象类型为键
- 注意
1.在DI容器中,依赖关系的定义是唯一的。 后定义的同名依赖,会覆盖前面定义好的依赖。
2.上面的键具体就是:带命名空间的类名,接口名,或者是一个别名
3.对于 $_definitions 数组中的元素,它要么是一个包含了”class” 元素的数组,要么是一个PHP callable, 再要么就是一个具体对象。这就是规范化后的最终结果
4.对于$_singletons数组中的元素,要不就是null(表示还未实例化),要不就是一个具体的实例
5.对于$_params数组中的元素,就是一个数组,包含构造函数的所有参数
6.对于$_reflections数组中的元素,就是一个ReflectionClass对象
7.setter注入可以在实例化后