10分钟快速理解依赖注入

Posted gaohj

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了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 "徒步旅行";
    }
}

 

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

class human
{
    protected $travel; // 出行方式
    public function __construct()
    {
        $this->travel = new drive(60,1000);
    }
    public function traveling(){
        $this->travel->run();
    }
}
$xiaoming = new human();
$xiaoming->traveling();

什么是依赖注入。
简单的说:在A类中使用了B类的实例时,B对象的构造不是在A类某个方法中初始化的,而是在A类外部初始化之后以B类的对象传入进来。这个过程就是依赖注入。
换一种通过配置文件来实现控制反转

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();

通过上面的方式,以什么方式旅行,只需要修改配置$config就行。
这在我们php里感触不明显,觉得修改$config和修改$travel = new drive(60,1000)差别不到,一方面是便于管理,另一方面是PHP的非编译型的特性优势。如果用Java来实现,感触就非常明显了,比如程序已经打包了,只需要修改配置文件,就可以控制类的依赖关系了。(千锋PHP培训)起到了解耦的作用。
虽然很多时候大家一说到控制反转,依赖注入,就非要和说到反射,我觉得上面IOC只是一种思想,具体的实现方式,在不同的语言中有不同的表现形式。只要将这种依赖关系解耦出来,可以配置化就是IOC的实现了。

以上是关于10分钟快速理解依赖注入的主要内容,如果未能解决你的问题,请参考以下文章

10分钟学Spring:一文搞懂spring依赖注入(DI)

Android片段和依赖注入

spring练习,在Eclipse搭建的Spring开发环境中,使用set注入方式,实现对象的依赖关系,通过ClassPathXmlApplicationContext实体类获取Bean对象(代码片段

PHP依赖注入,控制反转,反射Ioc容器和服务提供者各个概念的理解和使用

PHP依赖注入,控制反转,反射Ioc容器和服务提供者各个概念的理解和使用

深层理解Spring 控制反转和依赖注入,这一篇文够了