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 控制反轉
2018/04/01 理解控制反轉和依賴註入