1. 程式人生 > >2018/04/01 理解控制反轉和依賴註入

2018/04/01 理解控制反轉和依賴註入

name post user 使用 -o lod 就是 public list

首先,控制反轉和依賴註入不是一種編碼,是一種設計的思想。實現的方式也有很多。

控制反轉(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 控制反轉

2018/04/01 理解控制反轉和依賴註入