如何理解 PHP的依赖注入(DI) 和 控制反转(IoC)

名词解释:

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

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

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

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

使用依赖注入

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

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

问题导读:

  1. 整个过程中参与者都有谁?
  一般有三方参与者,一个是某个对象;一个是IoC/DI的容器;另一个是某个对象的外部资源。
   某个对象指的就是任意的、普通的PHP对象;
   IoC/DI的容器简单点说就是指用来实现IoC/DI功能的一个框架程序;
   对象的外部资源指的就是对象需要的,但是是从对象外部获取的,都统称资源,   比如:对象需要的其它对象、或者是对象需要的文件资源等等。
  1. 整个过程中参与者都有谁?
  2. 依赖:谁依赖于谁?为什么需要依赖?
  3. 注入:谁注入于谁?到底注入了什么?
  4. 控制反转:谁控制谁?控制什么?为何叫反转(有反转就应该有正转了,正转是什么呢?)
  5. 依赖注入和控制反转是同一概念吗?

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

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

2谁依赖于谁:

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

3为什么需要依赖:

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

4谁注入于谁:

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

5到底注入什么:

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

6谁控制谁:

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

76控制什么:

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

8为何叫反转:

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

class c
{
    public function say()
    {
        echo ‘hello‘;
    }
}

/**
 * Class a
 */
class a
{
    private $c;
    public function __construct()
    {
        $this->c = new C(); // 实例化创建C类
    }

    public function sayC()
    {
        echo $this->c->say(); // 调用C类中的方法
    }
}

$a = new a();
$a->sayC();

<?php
/**
 * 当有了IoC/DI的容器后,a类依赖c实例注入的示例
 */

/**
 * Class c
 */
class c
{
    public function say()
    {
        echo ‘hello‘;
    }
}

/**
 * Class a
 */
class a
{
    private $c;
    public function setC(C $c)
    {
        $this->c = $c; // 实例化创建C类
    }

    public function sayC()
    {
        echo $this->c->say(); // 调用C类中的方法
    }
}

$c = new C();
$a = new a();
$a->setC($c);
$a->sayC();

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

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

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

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

原文地址:https://www.cnblogs.com/jackbon/p/12034454.html

时间: 2024-10-06 21:45:21

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

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

首页 下载 扩展 应用 教程 代码 案例 资讯 讨论 全部 搜索 话说 依赖注入(DI) or 控制反转(IoC) 浏览:3641 发布日期:2014/03/20 分类:技术分享 科普:首先依赖注入和控制反转说的是同一个东西,是一种设计模式,这种设计模式用来减少程序间的耦合,鄙人学习了一下,看TP官网还没有相关的文章,就写下这篇拙作介绍一下这种设计模式,希望能为TP社区贡献一些力量. 首先先别追究这个设计模式的定义,否则你一定会被说的云里雾里,笔者就是深受其害,百度了N多文章,都是从理论角度来描

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

DI&IOC 在spring框架中DI与IOC说的其实是一回事 一句话:本来我接受各种参数来构造一个对象,现在只接受一个参数——已经实例化的对象. 也就是说我对对象的『依赖』是注入进来的,而和它的构造方式解耦了.构造它这个『控制』操作也交给了第三方,也就是控制反转IOC. 优势:在应用程序中的组件需要获取资源时,传统的方式是组件主动的从容器中获取所需要的资源,在这样的模式下开发人员往往需要知道在具体容器中特定资源的获取方式,增加了学习成本,同时降低了开发效率.反转控制的思想完全颠覆了应用程序组件

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

0X1 什么是依赖注入 依赖注入(Dependency Injection),是这样一个过程:某客户类只依赖于服务类的一个接口,而不依赖于具体服务类,所以客户类只定义一个注入点.在程序运行过程中,客户类不直接实例化具体服务类实例,而是客户类的运行上下文环境或专门组件负责实例化服务类,然后将其注入到客户类中,保证客户类的正常运行.详细的介绍可以阅读上一篇博文:http://www.cnblogs.com/dazhuangtage/p/5672190.html 0X2 什么是控制反转 在解释什么是控

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

要想理解 PHP 依赖注入 和 控制反转 两个概念,就必须搞清楚如下的两个问题: DI -- Dependency Injection 依赖注入 IoC -- Inversion of Control 控制反转 什么是依赖注入 没有你我就活不下去,那么,你就是我的依赖. 说白了就是: 不是我自身的,却是我需要的,都是我所依赖的.一切需要外部提供的,都是需要进行依赖注入的. 依赖注入举例 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 class Boy

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

DI(依赖注入,Dependency Injection),和所谓的IoC(控制反转,Inversion of Control )是一个意思. DI是一种通过接口实现松耦合的设计模式.初学者可能会好奇网上为什么有那么多技术文章对DI这个东西大兴其笔,是因为DI对于基于几乎所有框架下,要高效开发应用程序,它都是开发者必须要有的一个重要的理念,包括MVC开发.它是解耦的一个重要手段. DI模式可分为两个部分.一是移除对组件(上面示例中的LinqValueCalculator)的依赖,二是通过类的构造

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

首先依赖注入和控制反转说的是同一个东西,是一种设计模式,这种设计模式用来减少程序间的耦合,鄙人学习了一下,看TP官网还没有相关的文章,就写下这篇拙作介绍一下这种设计模式,希望能为TP社区贡献一些力量. 首先先别追究这个设计模式的定义,否则你一定会被说的云里雾里,笔者就是深受其害,百度了N多文章,都是从理论角度来描述,充斥着大量的生涩词汇,要么就是java代码描述的,也生涩. 不管怎么样,总算弄清楚一些了,下面就以php的角度来描述一下依赖注入这个概念. 先假设我们这里有一个类,类里面需要用到数据

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

Spring目前所拥有的功能非常多,常用的DI和MVC已经是开发中的家常便饭,而且使用Spring来管理其它的框架也是习以为常的事情.Spring在项目中的最大作用就是为了解耦,降低项目整体的耦合度,尽可能做到低耦合.Spring的核心就是IOC和AOP.IOC控制反转创建bean对象,通过DI依赖注入来完成bean对象的数据封装. IOC是一种开发思想,DI是一种开发实现 虽然业界经常提到什么IOC,什么DI,其实都是一个意思,只是IOC是Spring提出的设计开发思想,而DI是代码实现方式.

依赖注入(DI)和控制反转(IOC)【回顾】

在java开发中广泛的使用了IOC的思想,在PHP中同样也在广泛使用. 1 interface Coder 2 { 3 public function coding(); 4 } 实现类Javaer 1 class Javaer implements Coder 2 { 3 var $name; 4 5 public function __construct($name) 6 { 7 $this->name = $name; 8 } 9 public function coding() 10 {

依赖注入(DI)与服务容器(IoC)

参考文章:http://www.yuansir-web.com/2014/03/20/%E7%90%86%E8%A7%A3php-%E4%BE%9D%E8%B5%96%E6%B3%A8%E5%85%A5laravel-ioc%E5%AE%B9%E5%99%A8/?preview 我们在建一个类时,在类的内部有可能会用到另外一个对象实例举个栗子: class User{ public function getUser(){ $db = new DB(); // 这里产生了对数据库连接类的依赖 $d