服务容器(自己总结)依赖注入

为了理解什么是服务容器,查了很多资料(给自己看的)。我看的每个资料都会讲解什么是依赖注入还有反转控制(IoC),刚开始真不好理解!!依赖注入其实就是需要的类实现类(比如实例)传给你要用到的类里面去,通常通过构造函数。目的是为了实现程序之间的解偶。可以看下下面的例子。

Visit.php文件

<?php
// 设计公共接口
interface Visit{
    public function go();
}
// 实现不同交通工具类
class Leg implements Visit{
    public function go()
    {
        echo 'walk to Tibet';
    }
}
class Car implements Visit{
    public function go()
    {
        echo 'drive car to Tibet !!!';
    }
}
class Train implements Visit{
    public function go()
    {
        echo 'go to Tibet by train!!!';
    }
}

通常我们写业务代码的时候我们都会这么写。

Traveller.php文件

<?php
// 引入接口文件
include './Visit.php';
class Traveller {
    protected $trafficTool;

    public function __construct()
    {
        $this->trafficTool = new Leg();
    }

    public function visitTibet()
    {
        $this->trafficTool->go();
    }
}

$tra = new Traveller();
$tra->visitTibet();

简单说下上面的代码表单什么意思。我有个接口叫参观(Visit),里面定一了一个走的方法(go)。下面有它的实现类。脚(leg),轿车(car),火车(train)。再定义一个旅游者类,他要去拉萨。
我通常写代码都会想上面Traveller类一样。其实上面的代码有个问题,就是耦合,这两个程序之间产生了依赖关系。这种情况在简单的程序里面体现不出什么。但如果需求变更。比方说:我不要走着去拉萨我要坐火车去。这个时候上面的代码则必须要修改。
依赖注入则不会。用依赖注入方式实现上面的代码。

Traveller.php文件

<?php

class Traveller 
{

    protected $trafficTool;
//    为啥前面的那个Visit 不加上的化就不行?
    public function __construct(Visit $trafficTool)
    {
        $this->trafficTool = $trafficTool;
    }

    public function visitTibet()
    {
        $this->trafficTool->go();
    }

}

说实话刚看到的时候觉得没有变化。就是把new一个类提到外面。其实变化还是蛮大的。这里它实现了解偶。就算要求改成其他交通工具car、train都不会影响到traveller这个类。都是在外部实new完在传进来。

本作品采用《CC 协议》,转载必须注明作者和本文链接
讨论数量: 0
(= ̄ω ̄=)··· 暂无内容!

讨论应以学习和精进为目的。请勿发布不友善或者负能量的内容,与人为善,比聪明更重要!