依賴注入(DI)優(yōu)於使用$ Globals,因?yàn)樗鞔_地依賴性,而$ Globals則將其隱藏。 2. DI通過允許輕鬆嘲笑依賴項(xiàng)來提高可測試性,這與需要操縱全球狀態(tài)的$ Globals不同。 3。 di通過將組件與全球範(fàn)圍解耦來減少緊密的耦合,而$ Globals會(huì)產(chǎn)生不可預(yù)測的副作用和名稱空間污染。 4。 DI通過在Laravel和Symfony等現(xiàn)代框架中使用的容器支持控制(IOC),從而啟用可擴(kuò)展且可維護(hù)的體系結(jié)構(gòu)。 5。可以通過重構(gòu)功能接受依賴項(xiàng)作為參數(shù)並在新類中採用構(gòu)造函數(shù)注入來逐步完成從$ Globals的過渡。 6。構(gòu)造函數(shù)注入是首選的DI模式,因?yàn)樗_保在實(shí)例化時(shí)提供所需的依賴項(xiàng)。最終,DI導(dǎo)致更清潔,更模塊化和專業(yè)代碼,使其成為除簡單腳本以外的任何認(rèn)真PHP應(yīng)用程序的最佳實(shí)踐。
在現(xiàn)代PHP開發(fā)中,使用依賴注入而不是依靠$ GLOBALS是一種更可維護(hù),可測試和可擴(kuò)展的方法。儘管$ Globals提供了整個(gè)範(fàn)圍內(nèi)變量的訪問,但它引入了緊密的耦合,使代碼更難調(diào)試並破壞了可預(yù)測性。依賴注射(DI)通過明確提供需要它們的組件的依賴性來解決這些問題。

為什麼$ Globals跌倒
$ GLOBALS是PHP中的超級(jí)全球陣列,其中包含對全局範(fàn)圍中定義的所有變量的引用。儘管方便,但它鼓勵(lì)做法不佳:
- 隱藏的依賴性:當(dāng)函數(shù)從$ Globals中獲取數(shù)據(jù)時(shí),僅通過查看其簽名而依賴它的依賴是什麼。
- 難以測試:您無法輕易在單元測試中模擬或隔離行為,因?yàn)樵摴δ芤蕾囲锻獠咳譅顟B(tài)。
- 名稱空間污染:代碼的任何部分都可以修改$ GLOBALS,從而導(dǎo)致意外的副作用和難以追蹤的錯(cuò)誤。
- 緊密的耦合:組件取決於全球狀態(tài),而不是通過清晰的接口接收其所需的東西。
例如:

功能processOrder(){ $ db = $ globals ['database']; $ db-> query(“ ...”); }
此功能沒有聲明對數(shù)據(jù)庫的依賴性,它只是假設(shè)一個(gè)存在於$ GLOBALS中。這使它變得脆弱和不清楚。
依賴注入如何改善代碼質(zhì)量
依賴注入意味著將依賴關(guān)係(例如服務(wù),配置或?qū)ο螅耐獠總鬟f到類或功能,而不是讓其內(nèi)部獲取它們。

1。顯式依賴性
使用DI,從功能或構(gòu)造函數(shù)簽名中可以明確依賴性:
類訂單處理器{ 私人$數(shù)據(jù)庫; public函數(shù)__construct($ database){ $ this-> database = $數(shù)據(jù)庫; } 公共功能過程(){ $ this-> database-> query(“ ...”); } }
現(xiàn)在很明顯, OrderProcessor
需要一個(gè)數(shù)據(jù)庫來工作。
2。更好的測試
您可以在測試過程中輕鬆注入模擬數(shù)據(jù)庫:
$ mockdb = $ this-> createMock(database :: class); $ mockdb->方法('query') - > willreturn(true); $ processor = new OrderProcessor($ MOCKDB); $ result = $ processor-> process();
無需建立全球狀態(tài)或擔(dān)心副作用。
3。寬鬆的耦合和可重複性
類與全局變量或特定實(shí)現(xiàn)沒有綁定。您可以在不更改內(nèi)部邏輯的情況下交換數(shù)據(jù)庫,記錄器或配置管理器。
4。支持控制反轉(zhuǎn)(IOC)
DI與IOC容器配合使用,該容器可以自動(dòng)管理對象創(chuàng)建和依賴關(guān)係。 Laravel,Symfony和Slim之類的框架廣泛使用DI容器來簡化應(yīng)用程序體系結(jié)構(gòu)。
使用簡單容器的示例:
$ container = new container(); $ container-> set('database',function(){ 返回新數(shù)據(jù)庫($ host,$ user,$ pass); }); $ container-> set('OrderProcessor',function($ c){ 返回新訂單處理器($ c-> get('database')); });
這樣可以使對象創(chuàng)建集中和配置。
常見的DI模式
注入依賴性的主要方法有三種:
- 構(gòu)造函數(shù)注入:通過構(gòu)造函數(shù)(最常見和建議)通過依賴項(xiàng)。
- 設(shè)置器注入:使用二傳劑方法注入可選的或可更換的依賴項(xiàng)。
- 接口注入:在PHP中較不常見;涉及實(shí)現(xiàn)定義依賴性注射方式的接口。
首選構(gòu)造函數(shù)注入,因?yàn)樗鼜囊婚_始就可以確保存在所需的依賴關(guān)係。
從$ Globals過渡到DI
遠(yuǎn)離$ Globals並不一定要一次發(fā)生。開始?。?/p>
- 確定使用$ GLOBALS的功能。
- 重構(gòu)它們改為接受參數(shù)。
- 從一開始就在新類中使用依賴注入。
- 逐漸引入一個(gè)用於管理複雜對像圖的DI容器。
例如,替換以下內(nèi)容:
函數(shù)sendemail($ to to,$ object){ $ mailer = $ globals ['mailer']; $ mailer-> send($ to to,$ object); }
和:
函數(shù)sendemail($ to,$ objecter,mailer $ mailer){ $ mailer-> send($ to to,$ object); }
或者更好的是,用構(gòu)造函數(shù)注入將封裝在班級(jí)中。
底線
依賴注入可促進(jìn)清潔劑,更模塊化和可測試的代碼。儘管$ Globals似乎是共享數(shù)據(jù)的快速方法,但它導(dǎo)致技術(shù)債務(wù)和脆弱的應(yīng)用程序。 DI需要更多的前期努力,但在長期可維護(hù)性和靈活性方面得到了回報(bào)。
這不僅是一種趨勢,而且是專業(yè)PHP開發(fā)中的基本實(shí)踐。一旦您開始始終如一地使用DI,回到全球變量就感覺就像踏入過去一樣。
基本上,如果您要構(gòu)建簡單腳本以外的任何內(nèi)容,那麼DI就是必需的路。
以上是依賴注入:$ GLOBALS的優(yōu)越替代品的詳細(xì)內(nèi)容。更多資訊請關(guān)注PHP中文網(wǎng)其他相關(guān)文章!

熱AI工具

Undress AI Tool
免費(fèi)脫衣圖片

Undresser.AI Undress
人工智慧驅(qū)動(dòng)的應(yīng)用程序,用於創(chuàng)建逼真的裸體照片

AI Clothes Remover
用於從照片中去除衣服的線上人工智慧工具。

Clothoff.io
AI脫衣器

Video Face Swap
使用我們完全免費(fèi)的人工智慧換臉工具,輕鬆在任何影片中換臉!

熱門文章

熱工具

記事本++7.3.1
好用且免費(fèi)的程式碼編輯器

SublimeText3漢化版
中文版,非常好用

禪工作室 13.0.1
強(qiáng)大的PHP整合開發(fā)環(huán)境

Dreamweaver CS6
視覺化網(wǎng)頁開發(fā)工具

SublimeText3 Mac版
神級(jí)程式碼編輯軟體(SublimeText3)

$ globalsallowsunistendedVariableWriting,EnablingAttAckerStomaniPulateCricalDatalikeUserIdSorrolesRolesSorroleswithOutValidation; 2.ItinCreaseSestHeatTackSurfaceBybreakingSapsulation,makefunctionsDepentFunctionsDepentNepentEndectendentondepentNepentEndepentNepentEndepentNepentEndepentNepentEndectentendepentNepentEndeptentOblobalBalbaltStateThateThatCanblobeD.

Dependencyinjection(DI)issuperiortousing$GLOBALSbecauseitmakesdependenciesexplicit,whereas$GLOBALShidesthem.2.DIimprovestestabilitybyallowingeasymockingofdependencies,unlike$GLOBALSwhichrequiresmanipulatingglobalstate.3.DIreducestightcouplingbydecoup

Using$GLOBALScreateshiddendependencies,makingfunctionshardertotest,fragile,andunreusable;2.Itcomplicatesunittestingbyrequiringglobalstatemanipulation,leadingtoslow,fragiletests;3.Globalstateisunpredictableduetouncontrolledmodifications,causingbugsand

要消除PHP中的$GLOBALS,應(yīng)首先分析其使用情況,然後通過依賴注入、配置對象和逐步重構(gòu)替代全局變量。 1.使用grep等工具找出所有$GLOBALS用法,記錄鍵名及位置;2.將數(shù)據(jù)庫連接、配置等全局變量替換為顯式依賴,如通過構(gòu)造函數(shù)注入PDO或Config對象;3.創(chuàng)建服務(wù)類(如Logger、UserService)封裝功能,避免函數(shù)依賴全局狀態(tài);4.將配置集中管理,從返回?cái)?shù)組的配置文件加載,並註入所需類;5.按步驟小範(fàn)圍重構(gòu),每次替換一個(gè)$GLOBALS引用,測試確保行為一致;6.警惕包含

$GLOBALSmanipulationcancauseunpredictablebugsinPHP;todebugandresolveit,1.Understandthat$GLOBALSprovidesglobalaccesstoallvariables,makingstatechangeshardtotrack;2.DetectunwantedmodificationsusingstrategicdebugloggingandaGlobalsWatcherclasstosnapshotan

$ globalsismisminimalinmostcasesbutcanbecomesigantificantifificanthigh-frequencyFunctionsorlong-runningscripts; 1. $ globalalscreatesmboltablablablablablablablablablablablablablablablablablableheadbyMirrorrorrorrorrorrorrorrorglobalvariobles; 2.Arrayaccessvia $ Globals $ GLOBALS $ GLEBALS ['varrari'''''''] ISSLAIRICTARNAND

$GLOBALSisnotinherentlybad;itisatoolwhosevaluedependsonitsuse.Itisanassociativearrayprovidingaccesstoallglobalvariables,allowingfunctionstoreadglobalvariableswithouttheglobalkeyword.Itsnegativereputationstemsfromencouragingglobalstate,obscuringdepend

Using$GLOBALSmaybeacceptableinlegacysystemslikeWordPresspluginswhereitensurescompatibility,2.Itcanbeusedtemporarilyduringbootstrappingbeforedependencyinjectionisavailable,3.Itissuitableforread-onlydebuggingtoolsindevelopmentenvironments.Despitethesec
