2018/04/01 理解控制反转和依赖注入

首先,控制反转和依赖注入不是一种编码,是一种设计的思想。实现的方式也有很多。

控制反转(IOC)是一种思想,依赖注入(DI)是实施这种思想的方法。

具体的概念也不多赘述,网上一搜一大片对于这方面的知识的讲解,这里只说一下我对它的理解。

--

先刨除这个概念,单单思考一个问题,如果你需要连接一个Mysql数据库,你需要怎么做?

以下均为伪代码

function __construct()
{
    // 连接Mysql数据库
}

--

这也没什么问题,对吧。

假如我们换一个 mariadb 数据库呢?

function __construct()
{
    // 连接Mariadb数据库
}

--

也没什么问题,那我这两个数据库都有呢?

去程序上切?(⊙o⊙)…

--

为了解决这种问题,我们才会使用到 控制反转 和 依赖注入

首先,我们知道,数据库SQL是不变的。变的是使用什么数据库对吧?

那么我们把这个可以组合SQL的叫做 【容器】,把需要使用的 数据库 【注入到容器里】

 public function __construct($dsn, $username = null, $password = null, $options = null ) {

        list($driver_name) = explode(':', $dsn, 2);

        // 定义driver判断数据库类型--可扩展为其他数据库
        $driver_class = '\M\Database\\'.$driver_name;

        $this->_driver = \M\IoC::construct($driver_class, $dsn, $username, $password, $options);  
  }

_driver 就是具体的数据库服务

--

如果还是不能理解

那我推荐这篇文章 简单解释什么是 依赖注入 和 控制反转

--

如果感觉可以,那这里引入 控制反转和依赖注入 的概念

--

依赖注入

看SQL组合,他需要一个服务被注入进来才能使用,没有无法使用,没有你,我无法生存。就是依赖注入。

在详细看的话,就是

首先,数据库服务和SQL不在是强依赖关系。

SQL服务是由外部给与的,自己本身并没有能力,SQL和数据库服务是有依赖的,但是这个依赖是外部给予,因此我们可以说是由外部注入给他的,所以这就叫 依赖注入。

--

控制反转

而反过来说,具有何种数据库服务不是他内部自身控制的,而是由外部控制的,相当于将数据库服务具是何种交给了外部,外部来决定程序该有的超能力,所以服务的控制权被由自身控制反转为外部控制,这被称为 控制反转。

--

我的文字功底真的很差,现在真的很佩服写的很清晰的人。

如果感觉还是感觉有点不太明白,推荐几篇文章吧,我觉得很好的

理解依赖注入与控制反转

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

可以看看 Laravel 的实现

Laravel 控制反转

posted @ 2018-04-02 11:46  Zzz哈  Views(160)  Comments(0Edit  收藏  举报