简介

  1. IoC Inversion of Control 控制反转
    DI  Dependency Injection  依赖注入
  2. 依赖注入和控制反转说的实际上是同一种东西,它们是一种设计模式,这种设计模式用来减少程序间的耦合

优势(为什么使用)

  1. 使用依赖注入,最重要的一点好处就是有效的分离了对象和它所需要的外部资源,使得它们松散耦合,有利于功能复用,更重要的是使得程序的整个体系结构变得非常灵活。

概念

  1. 依赖注入和控制反转是对同一件事情的不同描述,从某个方面讲,就是它们描述的角度不同。
      a)依赖注入是从应用程序的角度在描述,可以把依赖注入,即:应用程序依赖容器创建并注入它所需要的外部资源;
      b)控制反转是从容器的角度在描述,即:容器控制应用程序,由容器反向的向应用程序注入应用程序所需要的外部资源。

问答

  1. 对于一个菜鸟,如果你看了上面的概念还是一头雾水的话,那么恭喜你,你和我一样不是天才,那么下面就让我们借助几个问答来搞清楚这个概念的意思吧。

问题

  1. 1、整个过程参与者都有谁?
    2、依赖:谁依赖于谁?为什么需要依赖?
    3、注入:谁注入于谁?到底注入了什么?
    4、控制反转:谁控制谁?控制什么?为何叫反转(有反转就应该有正转了,正转是什么呢?)
    5、依赖注入和控制反转是同一个概念吗?

回答

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

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

谁依赖于谁:

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

为什么需要依赖:

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

谁注入于谁:

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

到底注入什么:

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

谁控制谁:

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

为何叫反转:

  1. 反转是相对于正向而言的,那么什么算是正向的呢?
  2. 考虑一下常规情况下的应用程序,如果要在A里面使用C,你会怎么做呢?当然是直接去创建C的对象,也就是说,是在A类中主动去获取所需要的外部资源C$c = new C();),这种情况被称为正向的。那么什么是反向呢?就是A类不再主动去获取C,而是被动等待,等待IoC/DI的容器获取一个C的实例,然后反向的注入到A类中。
  3. 用图例来说明一下,先看没有IoC/DI的时候,常规的A类使用C类的示意图,如下图所示:

  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 __construct()
  24. {
  25. $this->c = new C(); // 实例化创建C类
  26. }
  27.  
  28. public function sayC()
  29. {
  30. echo $this->c->say(); // 调用C类中的方法
  31. }
  32. }
  33.  
  34. $a = new a();
  35. $a->sayC();

当有了IoC/DI的容器后,A类不再主动去创建C了,如下图所示:

而是被动等待,等待IoC/DI的容器获取一个C的实例,然后反向的注入到A类中,如下图所示:

  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. 根据上面的讲述,我们不难出来,`依赖注入``控制反转`确实是对同一件事情的不同描述,从某个方面讲,就是它们描述的`角度`不同。

总结

其实IoC/DI对编程带来的最大改变不是从代码上,而是从思想上,发生了“主从换位”的变化。应用程序原本是老大,要获取什么资源都是主动出击,但是在IoC/DI思想中,应用程序就变成被动的了,被动的等待IoC/DI容器来创建并注入它所需要的资源了。

注意

我们上面说了,这是一种“设计模式”,就像“工厂模式”和“单例模式”等是一样的,它是一种面向对象中的编程“思想”,自然它也不仅限于PHP,而是所有面向对象的语言基本都是可以适用的。

  1.  
  1.  
  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. 【串线篇】依赖注入DI与控制反转IOC

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

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

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

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

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

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

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

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

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

  9. 依赖注入(DI)与控制反转(IOC)

    DI(依赖注入,Dependency Injection),和所谓的IoC(控制反转,Inversion of Control )是一个意思. DI是一种通过接口实现松耦合的设计模式.初学者可能会好奇 ...

随机推荐

  1. TW实习日记:第六天

    今日的一整天都是在开发微信相关的接口,因为项目的系统是嵌在企业微信中,所以不可避免的要产生微信UserID和企业系统ID的匹配关系,那么就需要用手机号或是邮箱这种两边都存在的唯一参数进行匹配.然后再将 ...

  2. ES数据备份到HDFS

    1.准备好HDFS(这里我是本机测试) 2.es 安装repository-hdfs插件 (如es为多节点需在每个节点都安装插件) elasticsearch-plugin install repos ...

  3. Codeforces 552 E. Two Teams

    E. Two Teams time limit per test 2 seconds memory limit per test 256 megabytes input standard input ...

  4. 创建image

    摘要: 本节演示如何通过 Web GUI 和 CLI 两种方法创建 Image. 本节演示如何通过 Web GUI 和 CLI 两种方法创建 Image. OpenStack 为终端用户提供了 Web ...

  5. hadoop的safemode 安全模式

    hadoop启动检查副本块数,就会进入safemode safemode的相关情况 虽然不能进行修改文件的操作,但是可以浏览目录结构.查看文件内容的. 在命令行下是可以控制安全模式的进入.退出和查看的 ...

  6. Hybrid APP基础篇(三)->Hybrid APP之Native和H5页面交互原理

    本文已经不维护,新地址: http://www.cnblogs.com/dailc/p/8097598.html 说明 Hybrid模式原生和H5交互原理 目录 前言 参考来源 前置技术要求 楔子 A ...

  7. 团队Alpha冲刺(九)

    目录 组员情况 组员1(组长):胡绪佩 组员2:胡青元 组员3:庄卉 组员4:家灿 组员5:凯琳 组员6:翟丹丹 组员7:何家伟 组员8:政演 组员9:黄鸿杰 组员10:刘一好 组员11:何宇恒 展示 ...

  8. html个人网页

    <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/ ...

  9. 周总结<8>

    周次 学习时间 新编代码行数 博客量 学到知识点 15 15 100 1 Html页面设计:虚拟机:(C语言)排序 Html案例: <!DOCTYPE html PUBLIC "-// ...

  10. linux普通用户被内存被限制的问题

    把应用从root用户迁移到普通用户test,由于普通用户会被限制最大的进程数,当进程数占满后出现了下面的错误 /bin/bash: Resource temporarily unavailable. ...