关于YII依赖注入和控制反转的讲解

基本概念

1.依赖倒置(反转)原则(DIP):一种软件架构设计的原则(抽象概念,是一种思想)

在面向对象编程领域中,依赖反转原则(Dependency inversion principle,DIP)是指一种特定的解耦(传统的依赖关系创建在高层次上,而具体的策略设置则应用在低层次的模块上)形式,使得高层次的模块不依赖于低层次的模块的实现细节,依赖关系被颠倒(反转),从而使得低层次模块依赖于高层次模块的需求抽象。

该原则规定:

  1. 1.高层次的模块不应该依赖于低层次的模块,两者都应该依赖于抽象接口。
  2. 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获取依赖对象的类中
对于 yii\di\Instance:
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注入可以在实例化后



  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值