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和数据库服务是有依赖的,但是这个依赖是外部给予,因此我们可以说是由外部注入给他的,所以这就叫 依赖注入。
--
控制反转
而反过来说,具有何种数据库服务不是他内部自身控制的,而是由外部控制的,相当于将数据库服务具是何种交给了外部,外部来决定程序该有的超能力,所以服务的控制权被由自身控制反转为外部控制,这被称为 控制反转。
--
我的文字功底真的很差,现在真的很佩服写的很清晰的人。
如果感觉还是感觉有点不太明白,推荐几篇文章吧,我觉得很好的
可以看看 Laravel 的实现