要理解PHP 依賴注入 與 控制反轉 兩個概念,就必須先搞清楚如下的兩個問題:
DI —— Dependency Injection 依賴注入
IoC —— Inversion of Control 控制反轉
沒有你我就活不下去,那麼,你就是我的依賴。 說白了就是:
不是我自己的,卻是我需要的,都是我所依賴的。一切需要外部提供的,都是需要依賴注入的。
1 ##2# 3456789#10 1112131415161718
|
class
Boy {
protected $girl
public $girl ) {
$this
$girl # ##}
|
從上述程式碼我們可以看到Boy
強依賴Girl
必須在建構時注入Girl
的實例才行。
那麼為什麼要有依賴注入
這個概念,依賴注入
到底解決了什麼問題?
我們將上述程式碼修正一下我們初學時都寫過的程式碼:
1
2
3
4
#5
6
7
|
class Boy {
protected $girl #;
public function __construct() {
# $this ->girl = new #Girl();
|
}
| 這種方式與前面的方式有什麼不同呢? 我們會發現 Boy 重生自己想換個類型的女朋友都要把自己扒光才行。 某天的女朋友被我們硬編碼到 Boy的身體裡去了。 。 。 每次 BoyBoy ,很想讓她當自己的女朋友。 。 。怎麼辦? 重生自己。 。 。扒開自己。 。 。把特別喜歡一個 LoliGirlGirl 丟了。 。 。把 LoliGirl
塞進去。 。 。
1 #2 3 ##4#5
6 ##11 7 8 9 1012
class LoliGirl {
}
class
| protected
##1#234#567 ##8
101112#13#14#15171819#20#21#22##23 24 |
25
#interfaceGirl {
##} ## class LoliGril implement Girl {
#
## }
class Vixen implement Girl {
#// Vixen definitely is a girl, do not doubt it.
}
classBoy {
protected
$girl;
$boy = new Boy( $vixen );
|
Boy
很高興,終於可以不用扒開自己就可以體驗不同的人生了。 。 。 So Happy!
1、建構器注入
1
2
3
4
#5 ##6##7
#8
|
<?php
Book {
private $db_conn ;
# # public function __construct( $db_conn ##) {
$this #} ->db_conn = $db_conn##;
}
2、setter注入
此時,如果取得一個book實例,只需要執行$newone = Ioc::makebook(); 以上是container的一個具體實例,最好還是不要把具體的某個依賴注入寫成方法,採用registry註冊,get取得比較好
問題總結1、參與者都有誰?答:一般有三方參與者,一個是某個物件;一個是IoC/DI的容器;另一個是某個物件的外在資源。又要名詞解釋一下,某個物件指的就是任意的、普通的Java物件; IoC/DI的容器簡單點說就是指用來實作IoC/DI功能的一個框架程式;物件的外部資源指的就是對象需要的,但是是從物件外部取得的,都統稱資源,例如:物件需要的其它物件、或者是物件需要的檔案資源等等。 2、依賴:誰依賴誰?為什麼會有依賴?答:某個物件依賴IoC/DI的容器。依賴是不可避免的,在一個專案中,各個類別之間有各種各樣的關係,不可能全部完全獨立,這就形成了依賴。傳統的開發是使用其他類別時直接調用,這會形成強耦合,這是要避免的。依賴注入借用容器轉移了被依賴物件實作解耦。 3、注入:誰注入於誰?到底注入什麼?答:透過容器向物件注入其所需的外部資源 4、控制反轉:誰控制誰?控制什麼?為什麼叫反轉?答案:IoC/DI的容器控制對象,主要是控制對象實例的建立。反轉是相對於正向而言的,那麼什麼算是正向的呢?考慮一下常規情況下的應用程序,如果要在A裡面使用C,你會怎麼做呢?當然是直接去創建C的對象,也就是說,是在A類中主動去取得所需要的外部資源C,這種情況稱為正向的。那什麼是反向呢?就是A類別不再主動去取得C,而是被動等待,等待IoC/DI的容器取得一個C的實例,然後反向的注入到A類別中。 5、依賴注入和控制反轉是同一概念嗎?答:從上面可以看出:依賴注入是從應用程式的角度在描述,可以把依賴注入描述完整點:應用程式依賴容器來建立並註入它所需要的外部資源;而控制反轉是從容器的角度在描述,描述完整點:容器控制應用程序,由容器反向的向應用程式註入應用程式所需的外部資源。 以上是PHP 依賴注入(DI) 和 控制反轉(IoC)實例教程的詳細內容。更多資訊請關注PHP中文網其他相關文章! 陳述: 本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn 上一篇:PHP7中有哪些特性下一篇:PHP7中有哪些特性 |