本文探討如何構(gòu)建一個簡單的依賴注入容器(DI 容器)PHP 包。文中所有代碼,包括 PHPDoc 注解和單元測試(100% 代碼覆蓋率),都已上傳至 GitHub 倉庫,并在 Packagist 上列出。
關(guān)鍵要點:
- 構(gòu)建 DI 容器有助于開發(fā)者理解依賴注入的基本原理和容器的工作機(jī)制。
- DI 容器主要有兩個作用:“依賴注入”和“容器”。它需要能夠使用構(gòu)造器注入或設(shè)置器注入方法來實例化和包含服務(wù)。
- Symfony 依賴注入容器可作為創(chuàng)建自定義容器的參考。它將容器配置分為參數(shù)和服務(wù),允許安全存儲應(yīng)用程序密鑰。
- 創(chuàng)建 DI 容器涉及創(chuàng)建項目目錄、創(chuàng)建
composer.json
文件以及實現(xiàn)容器互操作接口。它還涉及創(chuàng)建異常和引用類。 - 容器類需要包含用于檢索服務(wù)、檢查服務(wù)是否已定義、解析參數(shù)和初始化服務(wù)的方法。它還應(yīng)該具有防止循環(huán)引用的保護(hù)機(jī)制。
規(guī)劃我們的依賴注入容器
首先,我們將“依賴注入容器”拆分為兩個角色:“依賴注入”和“容器”。
依賴注入最常用的兩種方法是構(gòu)造器注入和設(shè)置器注入,即通過構(gòu)造器參數(shù)或方法調(diào)用傳遞類依賴項。如果我們的容器能夠?qū)嵗桶?wù),則它需要能夠執(zhí)行這兩種操作。
要成為一個容器,它必須能夠存儲和檢索服務(wù)的實例。與創(chuàng)建服務(wù)相比,這是一個相當(dāng)簡單的任務(wù),但仍然值得考慮。container-interop
包提供了一組容器可以實現(xiàn)的接口。主要接口是 ContainerInterface
,它定義了兩種方法:一種用于檢索服務(wù),另一種用于測試服務(wù)是否已定義。
interface ContainerInterface { public function get($id); public function has($id); }
學(xué)習(xí)其他依賴注入容器
Symfony 依賴注入容器允許我們通過多種不同方式定義服務(wù)。在 YAML 中,容器的配置可能如下所示:
parameters: # ... mailer.transport: sendmail services: mailer: class: Mailer arguments: ["%mailer.transport%"] newsletter_manager: class: NewsletterManager calls: - [setMailer, ["@mailer"]]
Symfony 將容器配置分為參數(shù)和服務(wù)的配置方式非常有用。這允許將 API 密鑰、加密密鑰和身份驗證令牌等應(yīng)用程序密鑰存儲在從源代碼存儲庫中排除的參數(shù)文件中。
在 PHP 中,Symfony 依賴注入組件的相同配置如下所示:
use Symfony\Component\DependencyInjection\Reference; // ... $container->setParameter('mailer.transport', 'sendmail'); $container ->register('mailer', 'Mailer') ->addArgument('%mailer.transport%'); $container ->register('newsletter_manager', 'NewsletterManager') ->addMethodCall('setMailer', array(new Reference('mailer')));
通過在對 setMailer
的方法調(diào)用中使用 Reference
對象,依賴注入邏輯可以檢測到此值不應(yīng)直接傳遞,而應(yīng)替換為它在容器中引用的服務(wù)。這允許輕松地將 PHP 值和其他服務(wù)注入服務(wù)而不會造成混淆。
開始
首先,創(chuàng)建一個新的項目目錄并創(chuàng)建一個 composer.json
文件,Composer 可以使用該文件自動加載我們的類。目前,此文件只將 SitePointContainer
命名空間映射到 src
目錄。
interface ContainerInterface { public function get($id); public function has($id); }
接下來,因為我們將使我們的容器實現(xiàn)容器互操作接口,我們需要使 Composer 下載它們并將它們添加到我們的 composer.json
文件中:
parameters: # ... mailer.transport: sendmail services: mailer: class: Mailer arguments: ["%mailer.transport%"] newsletter_manager: class: NewsletterManager calls: - [setMailer, ["@mailer"]]
除了主要的 ContainerInterface
之外,container-interop
包還定義了兩個異常接口。第一個用于創(chuàng)建服務(wù)時遇到的常規(guī)異常,另一個用于請求的服務(wù)找不到時。我們還將向此列表中添加另一個異常,用于請求的參數(shù)找不到時。
(以下內(nèi)容省略了代碼實現(xiàn)部分,因為篇幅過長,且核心邏輯已在上文中描述。 GitHub 倉庫中的完整代碼包含了異常類、引用類和容器類的完整實現(xiàn)。)
總結(jié)
我們學(xué)習(xí)了如何創(chuàng)建一個簡單的依賴注入容器,但是還有很多其他容器具有我們尚未實現(xiàn)的強(qiáng)大功能!
一些依賴注入容器,例如 PHP-DI 和 Aura.Di,提供了一個稱為自動裝配的功能。在這里,容器會猜測容器中的哪些服務(wù)應(yīng)該注入到其他服務(wù)中。為此,它們使用反射 API 來查找有關(guān)構(gòu)造器參數(shù)的信息。
您可以隨意派生該倉庫并添加自動裝配等功能,這是一個很好的練習(xí)!此外,我們保留了一個公共列表,其中列出了此容器的所有已知派生版本,以便其他人可以看到您所做的工作。只需使用下面的評論與我們分享您的工作,我們將確保將其添加進(jìn)去。
您也可以使用下面的評論與我們聯(lián)系。讓我們知道您想澄清或解釋的內(nèi)容,或者您發(fā)現(xiàn)的任何錯誤。
(以下內(nèi)容省略了 FAQs 部分,因為其內(nèi)容與上文高度重復(fù),且篇幅過長。)
以上是如何構(gòu)建自己的依賴注入容器的詳細(xì)內(nèi)容。更多信息請關(guān)注PHP中文網(wǎng)其他相關(guān)文章!

熱AI工具

Undress AI Tool
免費脫衣服圖片

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

AI Clothes Remover
用于從照片中去除衣服的在線人工智能工具。

Clothoff.io
AI脫衣機(jī)

Video Face Swap
使用我們完全免費的人工智能換臉工具輕松在任何視頻中換臉!

熱門文章

熱工具

記事本++7.3.1
好用且免費的代碼編輯器

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

禪工作室 13.0.1
功能強(qiáng)大的PHP集成開發(fā)環(huán)境

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

SublimeText3 Mac版
神級代碼編輯軟件(SublimeText3)

判斷密碼強(qiáng)度需結(jié)合正則與邏輯處理,基礎(chǔ)要求包括:1.長度不少于8位;2.至少含小寫字母、大寫字母、數(shù)字;3.可加入特殊字符限制;進(jìn)階方面需避免連續(xù)重復(fù)字符及遞增/遞減序列,這需PHP函數(shù)檢測;同時應(yīng)引入黑名單過濾常見弱密碼如password、123456;最終建議結(jié)合zxcvbn庫提升評估精度。

PHP變量作用域常見問題及解決方法包括:1.函數(shù)內(nèi)部無法訪問全局變量,需使用global關(guān)鍵字或參數(shù)傳入;2.靜態(tài)變量用static聲明,只初始化一次并在多次調(diào)用間保持值;3.超全局變量如$_GET、$_POST可在任何作用域直接使用,但需注意安全過濾;4.匿名函數(shù)需通過use關(guān)鍵字引入父作用域變量,修改外部變量則需傳遞引用。掌握這些規(guī)則有助于避免錯誤并提升代碼穩(wěn)定性。

要安全處理PHP文件上傳需驗證來源與類型、控制文件名與路徑、設(shè)置服務(wù)器限制并二次處理媒體文件。1.驗證上傳來源通過token防止CSRF并通過finfo_file檢測真實MIME類型使用白名單控制;2.重命名文件為隨機(jī)字符串并根據(jù)檢測類型決定擴(kuò)展名存儲至非Web目錄;3.PHP配置限制上傳大小及臨時目錄Nginx/Apache禁止訪問上傳目錄;4.GD庫重新保存圖片清除潛在惡意數(shù)據(jù)。

PHP注釋代碼常用方法有三種:1.單行注釋用//或#屏蔽一行代碼,推薦使用//;2.多行注釋用/.../包裹代碼塊,不可嵌套但可跨行;3.組合技巧注釋如用/if(){}/控制邏輯塊,或配合編輯器快捷鍵提升效率,使用時需注意閉合符號和避免嵌套。

AgeneratorinPHPisamemory-efficientwaytoiterateoverlargedatasetsbyyieldingvaluesoneatatimeinsteadofreturningthemallatonce.1.Generatorsusetheyieldkeywordtoproducevaluesondemand,reducingmemoryusage.2.Theyareusefulforhandlingbigloops,readinglargefiles,or

寫好PHP注釋的關(guān)鍵在于明確目的與規(guī)范,注釋應(yīng)解釋“為什么”而非“做了什么”,避免冗余或過于簡單。1.使用統(tǒng)一格式,如docblock(/*/)用于類、方法說明,提升可讀性與工具兼容性;2.強(qiáng)調(diào)邏輯背后的原因,如說明為何需手動輸出JS跳轉(zhuǎn);3.在復(fù)雜代碼前添加總覽性說明,分步驟描述流程,幫助理解整體思路;4.合理使用TODO和FIXME標(biāo)記待辦事項與問題,便于后續(xù)追蹤與協(xié)作。好的注釋能降低溝通成本,提升代碼維護(hù)效率。

ToinstallPHPquickly,useXAMPPonWindowsorHomebrewonmacOS.1.OnWindows,downloadandinstallXAMPP,selectcomponents,startApache,andplacefilesinhtdocs.2.Alternatively,manuallyinstallPHPfromphp.netandsetupaserverlikeApache.3.OnmacOS,installHomebrew,thenrun'bre

易于效率,啟動啟動tingupalocalserverenverenvirestoolslikexamppandacodeeditorlikevscode.1)installxamppforapache,mysql,andphp.2)uscodeeditorforsyntaxssupport.3)
