PHP的依賴注入 DI 和 控制反轉 IoC

2022-08-21 12:15:11 字數 2655 閱讀 3584

最近在使用thinkphp5框架,看了下他的原始碼,發現有很多地方也用到了依賴注入(控制反轉),覺得有必要和大家簡單聊一聊什麼是依賴注入以及怎麼使用它。

ioc -inversion of control  控制反轉

di - dependency injection 依賴注入

依賴注入和控制反轉說的實際上是同乙個東西,它們是一種設計模式,這種設計模式用來減少程式間的耦合

使用依賴注入,最重要的一點好處就是有效的分離了物件和它所需要的外部資源,使得它們鬆散耦合,有利於功能復用,更重要的是使得程式的整個體系結構變得非常靈活。

依賴注入和控制反轉是對同一件事情的不同描述,從某個方面講,就是它們描述的角度不同。

對於乙個菜鳥,如果你看了上面的概念還是一頭霧水的話,那麼恭喜你,你和我一樣不是天才,那麼下面就讓我們借助於幾個問答來搞清楚這個概念的意思吧。

整個過程中參與者都有誰?

依賴:誰依賴於誰?為什麼需要依賴?

注入:誰注入於誰?到底注入了什麼?

控制反**誰控制誰?控制什麼?為何叫反轉(有反轉就應該有正轉了,正轉是什麼呢?)

依賴注入和控制反轉是同一概念嗎?

整個過程中參與者都有誰?

一般有三方參與者,乙個是某個物件;乙個是ioc/di的容器;另乙個是某個物件的外部資源。

某個物件指的就是任意的、普通的php物件;

ioc/di的容器簡單點說就是指用來實現ioc/di功能的乙個框架程式;

物件的外部資源指的就是物件需要的,但是是從物件外部獲取的,都統稱資源,比如:物件需要的其它物件、或者是物件需要的檔案資源等等。

誰依賴於誰:

當然是某個物件依賴於ioc/di的容器
為什麼需要依賴:

物件需要ioc/di的容器來提供物件需要的外部資源
誰注入於誰:

是ioc/di的容器 注入 某個物件
到底注入什麼:

就是注入某個物件所需要的外部資源
誰控制誰:

當然是ioc/di的容器來控制物件了
控制什麼:

主要是控制物件例項的建立
為何叫反**

反轉是相對於正向而言的,那麼什麼算是正向的呢?

考慮一下常規情況下的應用程式,如果要在a裡面使用c,你會怎麼做呢?當然是直接去建立c的物件,也就是說,是在a類中主動去獲取所需要的外部資源c($c = new c();),這種情況被稱為正向的。那麼什麼是反向呢?就是a類不再主動去獲取c,而是被動等待,等待ioc/di的容器獲取乙個c的例項,然後反向的注入到a類中。

用圖例來說明一下,先看沒有ioc/di的時候,常規的a類使用c類的示意圖,如下圖所示:

**示意:

<?php /**

* 沒有ioc/di的時候,常規的a類使用c類的示例 */

/*** class c */

classc}

/*** class a */

class

a

public

function sayc()

}$a = new

a();

$a->sayc();

當有了ioc/di的容器後,a類不再主動去建立c了,如下圖所示:

而是被動等待,等待ioc/di的容器獲取乙個c的例項,然後反向的注入到a類中,如下圖所示:

**示意:

<?php /**

* 當有了ioc/di的容器後,a類依賴c例項注入的示例 */

/*** class c */

classc}

/*** class a */

class

a

public

function sayc()

}$c = new

c();

$a = new

a();

$a->setc($c);

$a->sayc();

9.什麼是正轉?

正轉就是按照普通的我們再類中直接建立物件例項,如 $c = new c();
10.依賴注入和控制反轉是同一概念嗎?

根據上面的講述,我們不難出來,`依賴注入`和`控制反轉`確實是對同一件事情的不同描述,從某個方面講,就是它們描述的`角度`不同。
其實ioc/di對程式設計帶來的最大改變不是從**上,而是從思想上,發生了「主從換位」的變化。應用程式原本是老大,要獲取什麼資源都是主動出擊,但是在ioc/di思想中,應用程式就變成被動的了,被動的等待ioc/di容器來建立並注入它所需要的資源了。

個人理解:就是當a類需要使用c類時,不直接建立,而是在a類中新增乙個屬性和乙個方法接受外部物件傳值,在a類去看叫依賴注入,在c類就是控制反轉。

依賴注入(DI)和控制反轉

依賴注入 di 和控制反轉 ioc 基本是乙個意思,因為說起來誰都離不開誰。簡單來說,a依賴b,但a不控制b的建立和銷毀,僅使用b,那麼b的控制權交給a之外處理,這叫控制反轉 ioc 而a要依賴b,必然要使用b的instance,那麼 通過a的介面,把b傳入 通過a的構造,把b傳入 通過設定a的屬性...

控制反轉 IOC 和依賴注入 DI

控制反 從拆解字面上的意思,控制,是指物件建立 銷毀和管理 單例 的控制權,傳統程式設計上這個是交給呼叫方來控制。反轉,是指這些控制權優傳統上的呼叫方反轉為類似乙個容器的東西,統一調配和管理。依賴注入 依賴,其實就是耦合,這裡更多的是呼叫方和操作物件的耦合。注入是指,將某些耦合關係從乙個東西注入到另...

依賴注入(DI)和控制反轉(IOC)

依賴注入是用於實現控制反轉的最常見的方式之一。依賴注入的思想是 當乙個類對另乙個類有依賴時,不在該類內部對依賴的類進行例項化,而是有乙個配置好了的bean.xml檔案,告訴容器所依賴的類,在例項化該類時,容器自動注入乙個依賴的類的例項。傳統的方法就是在類中先例項化依賴的類,然後再呼叫該類中的方法。p...