溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊(cè)×
其他方式登錄
點(diǎn)擊 登錄注冊(cè) 即表示同意《億速云用戶服務(wù)條款》

PHP中怎么實(shí)現(xiàn)依賴注入

發(fā)布時(shí)間:2021-06-29 17:22:22 來源:億速云 閱讀:233 作者:Leah 欄目:服務(wù)器

PHP中怎么實(shí)現(xiàn)依賴注入,很多新手對(duì)此不是很清楚,為了幫助大家解決這個(gè)難題,下面小編將為大家詳細(xì)講解,有這方面需求的人可以來學(xué)習(xí)下,希望你能有所收獲。

什么是依賴注入呢?

舉個(gè)簡單的例子:

(1)原始社會(huì)里,幾乎沒有社會(huì)分工。需要斧子的人(調(diào)用者)只能自己去磨一把斧子(被調(diào)用者)。

(2)進(jìn)入工業(yè)社會(huì),工廠出現(xiàn)。斧子不再由普通人完成,而在工廠里被生產(chǎn)出來,此時(shí)需要斧子的人(調(diào)用者)找到工廠,購買斧子,無須關(guān)心斧子的制造過程。

(3)進(jìn)入“按需分配”社會(huì),需要斧子的人不需要找到工廠,坐在家里發(fā)出一個(gè)簡單指令:需要斧子。斧子就自然出現(xiàn)在他面前。

PHP中怎么實(shí)現(xiàn)依賴注入

***種情況下,實(shí)例的調(diào)用者創(chuàng)建被調(diào)用的實(shí)例,必然要求被調(diào)用的類出現(xiàn)在調(diào)用者的代碼里。無法實(shí)現(xiàn)二者之間的松耦合。

第二種情況下,調(diào)用者無須關(guān)心被調(diào)用者具體實(shí)現(xiàn)過程,只需要找到符合某種標(biāo)準(zhǔn)(接口)的實(shí)例,即可使用。此時(shí)調(diào)用的代碼面向接口編程,可以讓調(diào)用者和被調(diào)用者解耦,這也是工廠模式大量使用的原因。但調(diào)用者需要自己定位工廠,調(diào)用者與特定工廠耦合在一起。

第三種情況下,調(diào)用者無須自己定位工廠,程序運(yùn)行到需要被調(diào)用者時(shí),依賴注入容器自動(dòng)提供被調(diào)用者實(shí)例。事實(shí)上,調(diào)用者和被調(diào)用者都處于依賴注入容器的管理下,二者之間的依賴關(guān)系由依賴注入容器提供。因此調(diào)用者與被調(diào)用者的耦合度進(jìn)一步降低,這使得應(yīng)用更加容易維護(hù),這就是依賴注入所要達(dá)到的目的。

在PHP中如何實(shí)現(xiàn)依賴注入呢?

依賴注入在現(xiàn)在的編程中,有著比較突出的優(yōu)勢(shì),這也是ThinkPHP、Laravel等框架,使用此編程思想的原因。那么這些框架到底是如何使用PHP去實(shí)現(xiàn)的呢?

下面我們使用一個(gè)簡單的案例,來說說其中的奧秘。

首先我們創(chuàng)建一個(gè)類,看起來是這樣的,包含一個(gè)屬性和兩個(gè)方:

PHP中怎么實(shí)現(xiàn)依賴注入

假設(shè)我們現(xiàn)在有另外兩個(gè)類,redisDB和cache,redisDB提供一個(gè)redis數(shù)據(jù)庫的操作,cache負(fù)責(zé)緩存功能的實(shí)現(xiàn)并且依賴于redisDB。如下:

PHP中怎么實(shí)現(xiàn)依賴注入

在上面這個(gè)類中我們簡單實(shí)現(xiàn)了redis的查詢、保存和刪除。另一個(gè)類和當(dāng)前這個(gè)類結(jié)構(gòu)很像:

PHP中怎么實(shí)現(xiàn)依賴注入

PHP中怎么實(shí)現(xiàn)依賴注入

PHP中怎么實(shí)現(xiàn)依賴注入

現(xiàn)在我們就當(dāng)已經(jīng)實(shí)現(xiàn)了redisDB和cache這兩個(gè)組件,具體的細(xì)節(jié)這里就先不做討論了,來看看如何使用使用吧。首先需要將兩個(gè)組件注入到容器中:

PHP中怎么實(shí)現(xiàn)依賴注入

到這里你可能會(huì)覺得這樣以來反而有點(diǎn)繁瑣了。cache和redisDB的結(jié)構(gòu)如此之像,完全可以把redis寫到cache中而沒必要單獨(dú)分離出來?但是你想過沒有,有些數(shù)據(jù)及時(shí)性沒那么高而且數(shù)量比較大,用redis有點(diǎn)不合適,mongodb是更好的選擇;有些數(shù)據(jù)更新頻率更慢,對(duì)查詢速度也沒要求,直接寫入文件保存到硬盤可能更為合適;再或者,你的客戶覺得redis運(yùn)維難度有點(diǎn)大,讓你給他換成memcache... 這就是為什么把它分離出來了。然后,繼續(xù)改進(jìn)代碼:

PHP中怎么實(shí)現(xiàn)依賴注入

PHP中怎么實(shí)現(xiàn)依賴注入

PHP中怎么實(shí)現(xiàn)依賴注入

我們新增加了一個(gè)接口BackendInterface,規(guī)定了redisDB,mongoDB,file這三個(gè)類必須實(shí)現(xiàn)這個(gè)接口所要求的功能,至于其他錦上添花的功能,隨你怎么發(fā)揮。而cache的代碼,好像沒有變,因?yàn)閏ache不需要關(guān)心數(shù)據(jù)是怎么存入數(shù)據(jù)庫或者文件中。而cache的調(diào)用者,也不需要關(guān)心cache具體是怎么實(shí)現(xiàn)的,只要根據(jù)接口實(shí)現(xiàn)相應(yīng)的方法就行了。多人協(xié)作你會(huì)更加受益,你們只需要商定好接口,然后分別實(shí)現(xiàn)就行了。

以上代碼還可以繼續(xù)改進(jìn),直到你認(rèn)為無可挑剔為止。比如,redis服務(wù)在一個(gè)請(qǐng)求中可能會(huì)調(diào)用多次,而每次調(diào)用都會(huì)重新創(chuàng)建,這將有損性能。只需擴(kuò)展一下DI容器就好增加一個(gè)參數(shù)或增加一個(gè)方法,隨你。

PHP中怎么實(shí)現(xiàn)依賴注入

這樣以來,如果某個(gè)服務(wù)在一次請(qǐng)求中要調(diào)用多次,你就可以將shared屬性設(shè)置為true,以減少不必要的浪費(fèi)。如果你覺得每次在注入時(shí)都要setDi有點(diǎn)繁瑣,想讓他自動(dòng)setDi,那可以這么做:

PHP中怎么實(shí)現(xiàn)依賴注入

然后,就可以這樣:

PHP中怎么實(shí)現(xiàn)依賴注入

看完上述內(nèi)容是否對(duì)您有幫助呢?如果還想對(duì)相關(guān)知識(shí)有進(jìn)一步的了解或閱讀更多相關(guān)文章,請(qǐng)關(guān)注億速云行業(yè)資訊頻道,感謝您對(duì)億速云的支持。

向AI問一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

php
AI