要理解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 ![]() PHP仍然流行的原因是其易用性、靈活性和強大的生態系統。 1)易用性和簡單語法使其成為初學者的首選。 2)與web開發緊密結合,處理HTTP請求和數據庫交互出色。 3)龐大的生態系統提供了豐富的工具和庫。 4)活躍的社區和開源性質使其適應新需求和技術趨勢。 ![]() PHP和Python都是高層次的編程語言,廣泛應用於Web開發、數據處理和自動化任務。 1.PHP常用於構建動態網站和內容管理系統,而Python常用於構建Web框架和數據科學。 2.PHP使用echo輸出內容,Python使用print。 3.兩者都支持面向對象編程,但語法和關鍵字不同。 4.PHP支持弱類型轉換,Python則更嚴格。 5.PHP性能優化包括使用OPcache和異步編程,Python則使用cProfile和異步編程。 ![]() PHP主要是過程式編程,但也支持面向對象編程(OOP);Python支持多種範式,包括OOP、函數式和過程式編程。 PHP適合web開發,Python適用於多種應用,如數據分析和機器學習。 ![]() PHP起源於1994年,由RasmusLerdorf開發,最初用於跟踪網站訪問者,逐漸演變為服務器端腳本語言,廣泛應用於網頁開發。 Python由GuidovanRossum於1980年代末開發,1991年首次發布,強調代碼可讀性和簡潔性,適用於科學計算、數據分析等領域。 ![]() PHP適合網頁開發和快速原型開發,Python適用於數據科學和機器學習。 1.PHP用於動態網頁開發,語法簡單,適合快速開發。 2.Python語法簡潔,適用於多領域,庫生態系統強大。 ![]() PHP在現代化進程中仍然重要,因為它支持大量網站和應用,並通過框架適應開發需求。 1.PHP7提升了性能並引入了新功能。 2.現代框架如Laravel、Symfony和CodeIgniter簡化開發,提高代碼質量。 3.性能優化和最佳實踐進一步提升應用效率。 ![]() PHPhassignificantlyimpactedwebdevelopmentandextendsbeyondit.1)ItpowersmajorplatformslikeWordPressandexcelsindatabaseinteractions.2)PHP'sadaptabilityallowsittoscaleforlargeapplicationsusingframeworkslikeLaravel.3)Beyondweb,PHPisusedincommand-linescrip ![]() PHP類型提示提升代碼質量和可讀性。 1)標量類型提示:自PHP7.0起,允許在函數參數中指定基本數據類型,如int、float等。 2)返回類型提示:確保函數返回值類型的一致性。 3)聯合類型提示:自PHP8.0起,允許在函數參數或返回值中指定多個類型。 4)可空類型提示:允許包含null值,處理可能返回空值的函數。 ![]() ![]() 熱AI工具![]() Undresser.AI Undress人工智慧驅動的應用程序,用於創建逼真的裸體照片 ![]() AI Clothes Remover用於從照片中去除衣服的線上人工智慧工具。 ![]() Undress AI Tool免費脫衣圖片 ![]() Clothoff.ioAI脫衣器 ![]() AI Hentai Generator免費產生 AI 無盡。 ![]() 熱門文章刺客信條陰影:貝殼謎語解決方案 3 週前ByDDD Windows 11 KB5054979中的新功能以及如何解決更新問題 2 週前ByDDD 在哪裡可以找到原子中的起重機控制鑰匙卡 3 週前ByDDD 節省R.E.P.O.解釋(並保存文件) 1 個月前By尊渡假赌尊渡假赌尊渡假赌 刺客信條陰影 - 如何找到鐵匠,解鎖武器和裝甲定制 3 週前ByDDD ![]() 熱工具![]() SublimeText3漢化版中文版,非常好用 ![]() MinGW - Minimalist GNU for Windows這個專案正在遷移到osdn.net/projects/mingw的過程中,你可以繼續在那裡關注我們。 MinGW:GNU編譯器集合(GCC)的本機Windows移植版本,可自由分發的導入函式庫和用於建置本機Windows應用程式的頭檔;包括對MSVC執行時間的擴展,以支援C99功能。 MinGW的所有軟體都可以在64位元Windows平台上運作。 ![]() Dreamweaver CS6視覺化網頁開發工具 ![]() mPDFmPDF是一個PHP庫,可以從UTF-8編碼的HTML產生PDF檔案。原作者Ian Back編寫mPDF以從他的網站上「即時」輸出PDF文件,並處理不同的語言。與原始腳本如HTML2FPDF相比,它的速度較慢,並且在使用Unicode字體時產生的檔案較大,但支援CSS樣式等,並進行了大量增強。支援幾乎所有語言,包括RTL(阿拉伯語和希伯來語)和CJK(中日韓)。支援嵌套的區塊級元素(如P、DIV), ![]() 禪工作室 13.0.1強大的PHP整合開發環境 |