摘要:前言最近在使用框架,看了下他的源碼,發(fā)現(xiàn)有很多地方也用到了依賴注入控制反轉,覺得有必要和大家簡單聊一聊什么是依賴注入以及怎么使用它。概念依賴注入和控制反轉是對同一件事情的不同描述,從某個方面講,就是它們描述的角度不同。
前言
最近在使用ThinkPHP5框架,看了下他的源碼,發(fā)現(xiàn)有很多地方也用到了依賴注入(控制反轉),覺得有必要和大家簡單聊一聊什么是依賴注入以及怎么使用它。
簡介IoC - Inversion of Control 控制反轉 DI - Dependency Injection 依賴注入
依賴注入和控制反轉說的實際上是同一個東西,它們是一種設計模式,這種設計模式用來減少程序間的耦合
優(yōu)勢(為什么使用)使用依賴注入,最重要的一點好處就是有效的分離了對象和它所需要的外部資源,使得它們松散耦合,有利于功能復用,更重要的是使得程序的整個體系結構變得非常靈活。
概念依賴注入和控制反轉是對同一件事情的不同描述,從某個方面講,就是它們描述的角度不同。
依賴注入是從應用程序的角度在描述,可以把依賴注入,即:應用程序依賴容器創(chuàng)建并注入它所需要的外部資源;
而控制反轉是從容器的角度在描述,即:容器控制應用程序,由容器反向的向應用程序注入應用程序所需要的外部資源。
問答對于一個菜鳥,如果你看了上面的概念還是一頭霧水的話,那么恭喜你,你和我一樣不是天才,那么下面就讓我們借助于幾個問答來搞清楚這個概念的意思吧。
問題整個過程中參與者都有誰?
依賴:誰依賴于誰?為什么需要依賴?
注入:誰注入于誰?到底注入了什么?
控制反轉:誰控制誰?控制什么?為何叫反轉(有反轉就應該有正轉了,正轉是什么呢?)
依賴注入和控制反轉是同一概念嗎?
回答
整個過程中參與者都有誰?
一般有三方參與者,一個是某個對象;一個是IoC/DI的容器;另一個是某個對象的外部資源。 某個對象指的就是任意的、普通的PHP對象; IoC/DI的容器簡單點說就是指用來實現(xiàn)IoC/DI功能的一個框架程序; 對象的外部資源指的就是對象需要的,但是是從對象外部獲取的,都統(tǒng)稱資源,比如:對象需要的其它對象、或者是對象需要的文件資源等等。
誰依賴于誰:
當然是某個對象依賴于IoC/DI的容器
為什么需要依賴:
對象需要IoC/DI的容器來提供對象需要的外部資源
誰注入于誰:
是IoC/DI的容器 注入 某個對象
到底注入什么:
就是注入某個對象所需要的外部資源
誰控制誰:
當然是IoC/DI的容器來控制對象了
控制什么:
主要是控制對象實例的創(chuàng)建
為何叫反轉:
反轉是相對于正向而言的,那么什么算是正向的呢? 考慮一下常規(guī)情況下的應用程序,如果要在A里面使用C,你會怎么做呢?當然是直接去創(chuàng)建C的對象,也就是說,是在A類中主動去獲取所需要的外部資源C($c = new C();),這種情況被稱為正向的。那么什么是反向呢?就是A類不再主動去獲取C,而是被動等待,等待IoC/DI的容器獲取一個C的實例,然后反向的注入到A類中。 用圖例來說明一下,先看沒有IoC/DI的時候,常規(guī)的A類使用C類的示意圖,如下圖所示:
代碼示意:
c = new C(); // 實例化創(chuàng)建C類 } public function sayC() { echo $this->c->say(); // 調用C類中的方法 } } $a = new a(); $a->sayC();
當有了IoC/DI的容器后,A類不再主動去創(chuàng)建C了,如下圖所示:
而是被動等待,等待IoC/DI的容器獲取一個C的實例,然后反向的注入到A類中,如下圖所示:
代碼示意:
c = $c; // 實例化創(chuàng)建C類 } public function sayC() { echo $this->c->say(); // 調用C類中的方法 } } $c = new C(); $a = new a(); $a->setC($c); $a->sayC();
9.什么是正轉?正轉就是按照普通的我們再類中直接創(chuàng)建對象實例,如 $c = new C();
10.依賴注入和控制反轉是同一概念嗎?
根據(jù)上面的講述,我們不難出來,`依賴注入`和`控制反轉`確實是對同一件事情的不同描述,從某個方面講,就是它們描述的`角度`不同。總結
其實IoC/DI對編程帶來的最大改變不是從代碼上,而是從思想上,發(fā)生了“主從換位”的變化。應用程序原本是老大,要獲取什么資源都是主動出擊,但是在IoC/DI思想中,應用程序就變成被動的了,被動的等待IoC/DI容器來創(chuàng)建并注入它所需要的資源了。
注意我們上面說了,這是一種“設計模式”,就像“工廠模式”和“單例模式”等是一樣的,它是一種面向對象中的編程“思想”,自然它也不僅限于PHP,而是所有面向對象的語言基本都是可以適用的。
文章版權歸作者所有,未經(jīng)允許請勿轉載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/21949.html
摘要:依賴注入控制反轉的一種具體實現(xiàn)方法。接下來,我們使用依賴注入實現(xiàn)控制反轉,使依賴關系倒置依賴被動傳入。從單元測試的角度看,依賴注入更方便和操作,方便了測試人員寫出質量更高的測試代碼。 前言 好的設計會提高程序的可復用性和可維護性,也間接的提高了開發(fā)人員的生產力。今天,我們就來說一下在很多框架中都使用的依賴注入。 一些概念 要搞清楚什么是依賴注入如何依賴注入,首先我們要明確一些概念。 D...
摘要:構造器注入實現(xiàn)特定參數(shù)的構造函數(shù),在新建對象時傳入所依賴類型的對象。 基本概念 1.依賴倒置(反轉)原則(DIP):一種軟件架構設計的原則(抽象概念,是一種思想)在面向對象編程領域中,依賴反轉原則(Dependency inversion principle,DIP)是指一種特定的解耦(傳統(tǒng)的依賴關系創(chuàng)建在高層次上,而具體的策略設置則應用在低層次的模塊上)形式,使得高層次的模塊不依賴于...
摘要:工廠模式,依賴轉移當然,實現(xiàn)控制反轉的方法有幾種。其實我們稍微改造一下這個類,你就明白,工廠類的真正意義和價值了。雖然如此,工廠模式依舊十分優(yōu)秀,并且適用于絕大多數(shù)情況。 此篇文章轉載自laravel-china,chongyi的文章https://laravel-china.org/top...原文地址: http://www.insp.top/learn-lar... ,轉載務必保...
摘要:本文一大半內容都是通過舉例來讓讀者去理解什么是控制反轉和依賴注入,通過理解這些概念,來更加深入。這種由外部負責其依賴需求的行為,我們可以稱其為控制反轉。工廠模式,依賴轉移當然,實現(xiàn)控制反轉的方法有幾種。 容器,字面上理解就是裝東西的東西。常見的變量、對象屬性等都可以算是容器。一個容器能夠裝什么,全部取決于你對該容器的定義。當然,有這樣一種容器,它存放的不是文本、數(shù)值,而是對象、對象的描...
摘要:對象之間耦合度過高的系統(tǒng),必然會出現(xiàn)牽一發(fā)而動全身的情形。控制被反轉之后,獲得依賴對象的過程由自身管理變?yōu)榱擞扇萜髦鲃幼⑷搿S谑牵o控制反轉取了一個更合適的名字叫做依賴注入。 Spring還可以這么學--IoC(控制反轉) / DI(依賴注入)理解 聲明:文章的前三部分參考博文:https://www.cnblogs.com/Nouno...這篇文章首發(fā)是在我的個人微信訂閱號每天學編...
閱讀 2186·2021-11-24 09:38
閱讀 3246·2021-11-08 13:27
閱讀 3089·2021-09-10 10:51
閱讀 3158·2019-08-29 12:20
閱讀 669·2019-08-28 18:28
閱讀 3464·2019-08-26 11:53
閱讀 2712·2019-08-26 11:46
閱讀 1523·2019-08-26 10:56