10分钟理解依赖注入

看到网络上很多“依赖注入”解释的话题,这篇博客呢也只是我自己的观点,如果你有不同的观点请拍砖,不用客气。

业务场景

小明要去旅游,但是还未确定以什么方式出游,有可能是徒步旅行,也有可能是自驾游。

代码演示

根据步行和驾车的速度来考虑距离旅游目的地的路程,所以这里定义了两个属性$speed$distance。所有有了如下代码:

interface travelInterface{

    public function __construct($speed, $distance);

    public function run();
}

abstract class travel implements travelInterface{

    protected $speed; // 最高时速
    protected $distance; // 最远路程

    public function __construct($speed, $distance)
    {
        $this->speed = $speed;
        $this->distance = $distance;
    }

}

class drive extends travel{

    public function run()
    {
        echo "自驾游";
    }
}

class walk extends travel{

    public function run()
    {
        echo "徒步旅行";
    }
}

如果是选择自驾游

class human
{
    protected $travel; // 出行方式

    public function __construct()
    {
        $this->travel = new drive(60,1000);
    }

    public function traveling(){
        $this->travel->run();
    }
}

$xiaoming = new human();
$xiaoming->traveling();

那么,如果需要换一种出行方式的时候,则需要修改human类。这里看起来修改非常简单,但是我们实际项目中可能会夹杂着很多的业务逻辑一起修改。

就说下依赖注入的基础方式

class human
{
    protected $travel; // 出行方式

    public function __construct(travel $travel)
    {
        $this->travel = $travel;
    }

    public function traveling(){
        $this->travel->run();
    }
}

$travel = new drive(60,1000);
$xiaoming = new human($travel);
$xiaoming->traveling();

什么是依赖注入

简单的说:在A类中使用了B类的实例时,B对象的构造不是在A类某个方法中初始化的,而是在A类外部初始化之后以B类的对象传入进来。这个过程就是依赖注入。

换一种通过配置文件来实现控制反转

$config = [
    "travel" => drive::class,
];

$travel = new $config["travel"](60,1000);
$xiaoming = new human($travel);
$xiaoming->traveling();

通过上面的方式,以什么方式旅行,只需要修改配置$config就行。

这在我们PHP里感触不明显,觉得修改$config和修改$travel = new drive(60,1000)差别不到,一方面是便于管理,另一方面是PHP的非编译型的特性优势。如果用Java来实现,感触就非常明显了,比如程序已经打包了,只需要修改配置文件,就可以控制类的依赖关系了。起到了解耦的作用。

虽然很多时候大家一说到控制反转,依赖注入,就非要和说到反射,我觉得上面IOC只是一种思想,具体的实现方式,在不同的语言中有不同的表现形式。只要将这种依赖关系解耦出来,可以配置化就是IOC的实现了。

原文地址:https://mengkang.net/790.html

时间: 2024-12-24 07:58:07

10分钟理解依赖注入的相关文章

如何理解IOC 依赖注入的思想(目前见过最好的对DI的描述)

1 IoC理论的背景 我们都知道,在采用面向对象方法设计的软件系统中,它的底层实现都是由N个对象组成的,所有的对象通过彼此的合作,最终实现系统的业务逻辑. 图1:软件系统中耦合的对象 如果我们打开机械式手表的后盖,就会看到与上面类似的情形,各个齿轮分别带动时针.分针和秒针顺时针旋转,从而在表盘上产生正确的时间.图1中描述的就是这样的一个齿轮组,它拥有多个独立的齿轮,这些齿轮相互啮合在一起,协同工作,共同完成某项任务.我们可以看到,在这样的齿轮组中,如果有一个齿轮出了问题,就可能会影响到整个齿轮组

php中依赖注入深入理解

PHP程序员如何理解依赖注入容器(dependency injection container) 背景知识 传统的思路是应用程序用到一个Foo类,就会创建Foo类并调用Foo类的方法,假如这个方法内需要一个Bar类,就会创建Bar类并调用Bar类的方法,而这个方法内需要一个Bim类,就会创建Bim类,接着做些其它工作. <?php// 代码[1]class Bim{    public function doSomething()    {        echo __METHOD__, '|'

对PHP依赖注入的理解实例分析_php技巧

本文实例讲述了对PHP依赖注入的理解.分享给大家供大家参考,具体如下: 看Laravel的IoC容器文档只是介绍实例,但是没有说原理,之前用MVC框架都没有在意这个概念,无意中在phalcon的文档中看到这个详细的介绍,感觉豁然开朗,复制粘贴过来,主要是好久没有写东西了,现在确实很懒变得! 首先,我们假设,我们要开发一个组件命名为SomeComponent.这个组件中现在将要注入一个数据库连接. 在这个例子中,数据库连接在component中被创建,这种方法是不切实际的,这样做的话,我们将不能改

关于依赖注入?不大理解?

问题描述 个人理解:依赖注入最主要的目的就是解耦合,举个例子:比如A类中,需要使用到B类,而B类需要new,但若是在调用A类时,将已经new了的B类传递给A,这就是依赖注入.publicclassA{Bb;publicA(){b=newB();}} ==>publicclassA{Bb;publicA(Bb){this.b=b;}} 那我的疑问就是:1,如果使用抽象和静态,不需要new,不是更方便?2,依赖注入应该是一种设计模式,为什么要使用IoC容器(如Spring.autofac等)?IoC

理解php依赖注入和控制反转_php技巧

要想理解php依赖注入和控制反转两个概念,就必须搞清楚如下的问题:  DI--Dependency Injection   依赖注入 IoC--Inversion of Control  控制反转 1.参与者都有谁? 答:一般有三方参与者,一个是某个对象:一个是IoC/DI的容器:另一个是某个对象的外部资源.又要名词解释一下,某个对象指的就是任意的.普通的Java对象; IoC/DI的容器简单点说就是指用来实现IoC/DI功能的一个框架程序:对象的外部资源指的就是对象需要的,但是是从对象外部获取

深一层看依赖注入

from:http://www.cnblogs.com/weidagang2046/archive/2009/12/10/1620587.html   依赖注入(DI)是控制反转(IoC)的一种方式.目前,在.NET和Java领域已经有相当多基于DI思想的对象容器,如:Spring,Unity等.本文试图避免重复性地介绍DI基础知识和DI容器的使用,而是希望深一层探讨DI的本质和对象间关系,以达到合理设计避免滥用DI的目的.   依赖注入 vs 创建对象 有不少地方这样描述:"依赖注入改变了使用

依赖注入 概念演示示例

最近开始研究依赖注入.刚刚开始研究这个东西,遇到不少问题.首先,概念就理解的不是很清楚,更不要说代码实现点什么了. Google之下找到一片好文:http://tech.it168.com/w/d/2007-07-10/200707100933943.shtml  看了下,对依赖注入理解清晰了不少.       不过,感觉作者为了简单,把所有的代码文件都放在了一个dll中.我觉得这样并不会 对读者理解依赖注入有帮助,所以重新整理了下,放在这里和大家分享.欢迎提出批评意见! 代码  以下是代码清单

用Dagger2在Android中实现依赖注入

依赖注入这个模式(模式已经用烂了,这里再烂一次)是用来给应用的各部分解耦的.使应用开发更加可扩展,更容易维护.通过本文你会学到如何使用Dagger2来处理依赖. 简介 如果以对象需要另外的一个对象才能完成一个完整功能的话,那么这里就存在一个依赖.比如,悟空要用金箍棒才能三打白骨精,要筋斗云才能十万八千里.悟空有对金箍棒和筋斗云的依赖.你可以在悟空对象里初始化金箍棒,也可以用一个工厂方法批量生产金箍棒.使用依赖注入可以无需一个专门的类来初始化这些依赖对象.这样就实现了解耦. 本教程会使用最新的Da

10分钟学会理解和解决MySQL乱码问题

原文:10分钟学会理解和解决MySQL乱码问题 在阅读本文之前,强烈建议对字符集编码概念还比较模糊的同学 阅读下博主之前对相关概念的一篇科普:十分钟搞清字符集和字符编码 本博客已经迁移至: http://cenalulu.github.io/ 为了更好的体验,请通过此链接阅读: http://cenalulu.github.io/mysql/mysql-mojibake/ MySQL出现乱码的原因 要了解为什么会出现乱码,我们就先要了解从客户端发起请求,到MySQL存储数据,再到下次从表取回客户