名词解释:

  1. IoC - Inversion of Control 控制反转
  2. DI - Dependency Injection 依赖注入

依赖注入和控制反转说的实际上是同一个东西,它们是一种设计模式,这种设计模式用来减少程序间的耦合

  • 依赖注入是从应用程序的角度在描述,可以把依赖注入,即:应用程序依赖容器创建并注入它所需要的外部资源;

  • 而控制反转是从容器的角度在描述,即:容器控制应用程序,由容器反向的向应用程序注入应用程序所需要的外部资源。

我们为什么使用依赖注入呢?

使用依赖注入

最重要的一点好处就是有效的分离了对象和它所需要的外部资源,使得它们松散耦合,有利于功能复用,

更重要的是使得程序的整个体系结构变得非常灵活

问题导读:

  1. 整个过程中参与者都有谁?

  1. 一般有三方参与者,一个是某个对象;一个是IoC/DI的容器;另一个是某个对象的外部资源。
  2. 某个对象指的就是任意的、普通的PHP对象;
  3. IoC/DI的容器简单点说就是指用来实现IoC/DI功能的一个框架程序;
  4. 对象的外部资源指的就是对象需要的,但是是从对象外部获取的,都统称资源,
    比如:对象需要的其它对象、或者是对象需要的文件资源等等。
  1. 整个过程中参与者都有谁?

  2. 依赖:谁依赖于谁?为什么需要依赖?

  3. 注入:谁注入于谁?到底注入了什么?

  4. 控制反转:谁控制谁?控制什么?为何叫反转(有反转就应该有正转了,正转是什么呢?)

  5. 依赖注入和控制反转是同一概念吗?

1整个过程中参与者都有谁?

  1. 一般有三方参与者,一个是某个对象;一个是IoC/DI的容器;另一个是某个对象的外部资源。
  2. 某个对象指的就是任意的、普通的PHP对象;
  3. IoC/DI的容器简单点说就是指用来实现IoC/DI功能的一个框架程序;
  4. 对象的外部资源指的就是对象需要的,但是是从对象外部获取的,都统称资源,比如:对象需要的其它对象、或者是对象需要的文件资源等等。

2谁依赖于谁:

  1. 当然是某个对象依赖于IoC/DI的容器

3为什么需要依赖:

  1. 对象需要IoC/DI的容器来提供对象需要的外部资源

4谁注入于谁:

  1. IoC/DI的容器 注入 某个对象

5到底注入什么:

  1. 就是注入某个对象所需要的外部资源

6谁控制谁:

  1. 当然是IoC/DI的容器来控制对象了

76控制什么:

  1. 主要是控制对象实例的创建

8为何叫反转:

  1. 反转是相对于正向而言的,那么什么算是正向的呢?
  2. 考虑一下常规情况下的应用程序,如果要在A里面使用C,你会怎么做呢?当然是直接去创建C的对象,也就是说,是在A类中主动去获取所需要的外部资源C$c = new C();),
    这种情况被称为正向的。那么什么是反向呢?就是A类不再主动去获取C,而是被动等待,等待IoC/DI的容器获取一个C的实例,然后反向的注入到A类中。
  1. 代码示意
  1. class c
  2. {
  3. public function say()
  4. {
  5. echo 'hello';
  6. }
  7. }
  8.  
  9. /**
  10. * Class a
  11. */
  12. class a
  13. {
  14. private $c;
  15. public function __construct()
  16. {
  17. $this->c = new C(); // 实例化创建C类
  18. }
  19.  
  20. public function sayC()
  21. {
  22. echo $this->c->say(); // 调用C类中的方法
  23. }
  24. }
  25.  
  26. $a = new a();
  27. $a->sayC();

  1. <?php
  2. /**
  3. * 当有了IoC/DI的容器后,a类依赖c实例注入的示例
  4. */
  5.  
  6. /**
  7. * Class c
  8. */
  9. class c
  10. {
  11. public function say()
  12. {
  13. echo 'hello';
  14. }
  15. }
  16.  
  17. /**
  18. * Class a
  19. */
  20. class a
  21. {
  22. private $c;
  23. public function setC(C $c)
  24. {
  25. $this->c = $c; // 实例化创建C类
  26. }
  27.  
  28. public function sayC()
  29. {
  30. echo $this->c->say(); // 调用C类中的方法
  31. }
  32. }
  33.  
  34. $c = new C();
  35. $a = new a();
  36. $a->setC($c);
  37. $a->sayC();

9.什么是正转?正转就是按照普通的我们再类中直接创建对象实例,如 $c = new C();

10.依赖注入和控制反转是同一概念吗?

  1. 根据上面的讲述,我们不难出来,`依赖注入``控制反转`确实是对同一件事情的不同描述
    从某个方面讲,就是它们描述的`角度`不同。
  2. 打完收工
  1. 其实IoC/DI对编程带来的最大改变不是从代码上,而是从思想上,发生了“主从换位”的变化。
    应用程序原本是老大,要获取什么资源都是主动出击,但是在IoC/DI思想中,
    应用程序就变成被动的了,被动的等待IoC/DI容器来创建并注入它所需要的资源了。
  1.  

如何理解 PHP的依赖注入(DI) 和 控制反转(IoC)的更多相关文章

  1. 依赖注入(DI)和控制反转(IOC)

    依赖注入(DI)和控制反转(IOC) 0X1 什么是依赖注入 依赖注入(Dependency Injection),是这样一个过程:某客户类只依赖于服务类的一个接口,而不依赖于具体服务类,所以客户类只 ...

  2. PHP依赖注入(DI)和控制反转(IoC)详解

    这篇文章主要介绍了PHP依赖注入(DI)和控制反转(IoC)的相关资料,具有一定的参考价值,感兴趣的小伙伴们可以参考一下 首先依赖注入和控制反转说的是同一个东西,是一种设计模式,这种设计模式用来减少程 ...

  3. 依赖注入(DI)和控制反转(IOC)的理解,写的太好了。

    学习过spring框架的人一定都会听过Spring的IoC(控制反转) .DI(依赖注入)这两个概念,对于初学Spring的人来说,总觉得IoC .DI这两个概念是模糊不清的,是很难理解的,今天和大家 ...

  4. 轻松理解 Java开发中的依赖注入(DI)和控制反转(IOC)

    前言 关于这个话题, 网上有很多文章,这里, 我希望通过最简单的话语与大家分享. 依赖注入和控制反转两个概念让很多初学这迷惑, 觉得玄之又玄,高深莫测. 这里想先说明两点: 依赖注入和控制反转不是高级 ...

  5. 【串线篇】依赖注入DI与控制反转IOC

    DI&IOC 在spring框架中DI与IOC说的其实是一回事 一句话:本来我接受各种参数来构造一个对象,现在只接受一个参数——已经实例化的对象. 也就是说我对对象的『依赖』是注入进来的,而和 ...

  6. ASP.NET MVC进阶之路:深入理解依赖注入(DI)和控制反转(IOC)

    0X1 什么是依赖注入 依赖注入(Dependency Injection),是这样一个过程:某客户类只依赖于服务类的一个接口,而不依赖于具体服务类,所以客户类只定义一个注入点.在程序运行过程中,客户 ...

  7. 话说 依赖注入(DI) or 控制反转(IoC)

    科普:首先依赖注入和控制反转说的是同一个东西,是一种设计模式,这种设计模式用来减少程序间的耦合,鄙人学习了一下,看TP官网还没有相关的文章,就写下这篇拙作介绍一下这种设计模式,希望能为TP社区贡献一些 ...

  8. PHP 依赖注入(DI) 和 控制反转(IoC)

    要想理解 PHP 依赖注入 和 控制反转 两个概念,就必须搞清楚如下的两个问题: DI —— Dependency Injection 依赖注入 IoC —— Inversion of Control ...

  9. spring学习之依赖注入DI与控制反转IOC

    一 Ioc基础 1.什么是Ioc? Ioc(Inversion of Control)既控制反转,Ioc不是一种技术,而是一种思想,在Java开发中意味着将设计好的对象交给容器来进行控制,并不是像传统 ...

随机推荐

  1. java 整理

    类和类之间,接口和接口之间是继承:类和接口之间是实现:类只能单继承,接口可以多继承. 1.接口的出现扩展了功能. 2.接口其实就是暴漏出来的规则. 3.接口的出现降低了耦合性,即设备与设备之间实现了解 ...

  2. Pandas模块 -- 实操练习

    如果对序列进行数学函数的运算,首选numpy模块: 如果对序列做统计运算,首选序列的“方法”,因为序列的“方法”更加丰富,如计算序列的偏度.峰度等,而Numpy模块是没有这样的函数. 手工构造数据框D ...

  3. 常用方法 DataTable转换为Entitys

    备注:摘自网上 有附地址 public static List<T> DataTableToEntities<T>(this DataTable dt) where T : c ...

  4. 洛谷 P2815 IPv6地址压缩 题解

    P2815 IPv6地址压缩 题目背景 (友情提示:IPv6基础知识曾多次出现在NOIP初赛中)Internet Protocol,互联网协议,即为我们常说的IP.我们目前常说的IP主要指它的第四版, ...

  5. 【CSP-S膜你考】即时战略(模拟)

    Problem B. 即时战略 (rts.c/cpp/pas) 注意 Input file: rts.in Output file: rts.out Time Limit : 2 seconds Me ...

  6. Java GUI 的基础学习

    Java Swing的学习: 重点理解容器类(Container)和组件类(Component): Java把component类的子类或间接子类创建的对象称为一个组件 Java把Container的 ...

  7. IIS服务器部署web应用《一》

    最近了解到开发用iis部署环境,于是了解了下. IIS用于部署web应用,其简单,配置方便,可以用作本地机器作为服务器进行部署.且所在部署系统为windows,便于使用iis. 端口80需要修改为别的 ...

  8. ZooKeeper入门实战教程(一)-介绍与核心概念

    1.ZooKeeper介绍与核心概念1.1 简介ZooKeeper最为主要的使用场景,是作为分布式系统的分布式协同服务.在学习zookeeper之前,先要对分布式系统的概念有所了解,否则你将完全不知道 ...

  9. NSGA-II算法学习

    什么是支配: 支配就是统治,在各方面都优于其余个体 如个体i支配个体j,就说明个体i在所有目标函数的表现上都不差于个体j,并且至少在一个目标上优于个体j: 什么是非支配: 非支配就是个体在种群中是最优 ...

  10. 写一个eggjs权限验证中间件

    关于中间件 https://eggjs.org/zh-cn/basics/middleware.html 官方文档说的很清楚了,不再叙述. 我们要达到怎么样一个效果? 用户没有登录不能访问一些特定的页 ...