摘要:中的服務(wù)容器與依賴注入的解析原文目前比較流行的容器其他依賴注入容器依賴注入當(dāng)類需要依賴于類,也就是說需要在類中實(shí)例化類的對(duì)象來使用時(shí)候,如果類中的功能發(fā)生改變,也會(huì)導(dǎo)致類中使用類的地方也要跟著修改,導(dǎo)致類與類高耦合。
PHP中的服務(wù)容器與依賴注入的解析--原文
目前比較流行的 PHP 容器:
Pimple
Laravel Container
其他依賴注入容器
依賴注入
當(dāng)A類需要依賴于B類,也就是說需要在A類中實(shí)例化B類的對(duì)象來使用時(shí)候,如果B類中的功能發(fā)生改變,也會(huì)導(dǎo)致A類中使用B類的地方也要跟著修改,導(dǎo)致A類與B類高耦合。這個(gè)時(shí)候解決方式是,A類應(yīng)該去依賴B類的接口,把具體的類的實(shí)例化交給外部。
就拿我們業(yè)務(wù)中常用的通知模塊來說。
常規(guī)messager = new Message(); } public function seed_msg() { return $this->messager->seed(); } } $Order = new Order(); echo $Order->seed_msg();
上面的代碼是我們傳統(tǒng)的寫法。首先由個(gè)消息發(fā)送的類。然后在我們需要發(fā)送消息的地方,調(diào)用發(fā)送消息的接口。有一天你需要添加一個(gè)發(fā)送短信的接口以滿足不同的需求。那么你會(huì)發(fā)現(xiàn)你要再M(fèi)essage類里面做修改。同樣也要再Order類里面做修改。這樣就顯得很麻煩。這個(gè)時(shí)候就有了依賴注入的思路。
賴注入的思路messager = $message; } public function seed_msg() { return $this->messager->seed(); } } //我們需要發(fā)送郵件的時(shí)候 $message = new SeedEmail(); //將郵件發(fā)送對(duì)象作為參數(shù)傳遞給Order $Order = new Order($message); echo $Order->seed_msg(); echo " "; //我們需要發(fā)送短信的時(shí)候 $message = new SeedSMS(); $Order = new Order($message); echo $Order->seed_msg();
我理解的服務(wù)容器就是一個(gè)自動(dòng)產(chǎn)生類的工廠。
服務(wù)容器binds[$abstract] = $concrete; } else { $this->instances[$abstract] = $concrete; } } public function make($abstract, $parameters = []) { if (isset($this->instances[$abstract])) { return $this->instances[$abstract]; } array_unshift($parameters, $this); return call_user_func_array($this->binds[$abstract], $parameters); } } //創(chuàng)建一個(gè)消息工廠 $message = new Container(); //將發(fā)送短信注冊(cè)綁定到工廠里面 $message->bind("SMS",function (){ return new SeedSMS(); }); //將發(fā)送郵件注冊(cè)綁定到工廠 $message->bind("EMAIL",function (){ return new SeedEmail(); }); //需要發(fā)送短信的時(shí)候 $SMS = $message->make("SMS"); echo $SMS->seed(); echo " "; $EMAIL = $message->make("EMAIL"); echo $EMAIL->seed();
container是一個(gè)簡(jiǎn)單的服務(wù)容器里面有bind,make兩個(gè)方法
bind是向容器中綁定服務(wù)對(duì)象。
make則是從容器中取出對(duì)象。
bind在bind方法中需要傳入一個(gè) concrete 我們可以傳入一個(gè)實(shí)例對(duì)象或者是一個(gè)閉包函數(shù)。
可以看到我這全使用的是閉包函數(shù),其實(shí)也可以這樣寫
$sms = new SeedSMS(); $message->bind("SMS",$sms);
后面這種寫法與閉包相比的區(qū)別就是我們需要先實(shí)例化對(duì)象才能往容易中綁定服務(wù)。而閉包則是我們使用這個(gè)服務(wù)的時(shí)候才去實(shí)例化對(duì)象??梢钥闯鲩]包是有很多的優(yōu)勢(shì)的。
makemake方法就從容器中出去方法。里面首先判斷了instances變量中是否有當(dāng)前以及存在的服務(wù)對(duì)象,如果有直接返回。如果沒有那么會(huì)通過 call_user_func_array返回一個(gè)對(duì)象。call_user_func_array的使用可以查看
PHP 中 call_user_func 的使用
文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請(qǐng)注明本文地址:http://m.hztianpu.com/yun/31728.html
摘要:現(xiàn)在我們就可以在構(gòu)造函數(shù)或者任何其他通過服務(wù)容器注入依賴項(xiàng)的地方使用類型提示注入接口創(chuàng)建一個(gè)新的類實(shí)例,此處將注入的實(shí)例。自動(dòng)解析構(gòu)造函數(shù)所需的依賴的服務(wù)容器實(shí)現(xiàn)了接口。 簡(jiǎn)單的服務(wù)容器 一個(gè)簡(jiǎn)單的 php 5.3 依賴注入容器。 項(xiàng)目地址:https://github.com/godruoyi/easy-container Why 目前比較流行的 PHP 容器: Pimple La...
摘要:控制反轉(zhuǎn)容器控制反轉(zhuǎn)使依賴注入變得更加便捷。有瑕疵控制反轉(zhuǎn)容器是實(shí)現(xiàn)的控制翻轉(zhuǎn)容器的一種替代方案。容器的獨(dú)立使用即使沒有使用框架,我們?nèi)匀豢梢栽陧?xiàng)目中使用安裝組件來使用的控制反轉(zhuǎn)容器。在沒有給定任何信息的情況下,容器是無法實(shí)例化相關(guān)依賴的。 聲明:本文并非博主原創(chuàng),而是來自對(duì)《Laravel 4 From Apprentice to Artisan》閱讀的翻譯和理解,當(dāng)然也不是原汁原味...
摘要:劃下重點(diǎn),服務(wù)容器是用于管理類的依賴和執(zhí)行依賴注入的工具。類的實(shí)例化及其依賴的注入,完全由服務(wù)容器自動(dòng)的去完成。 本文首發(fā)于 深入剖析 Laravel 服務(wù)容器,轉(zhuǎn)載請(qǐng)注明出處。喜歡的朋友不要吝嗇你們的贊同,謝謝。 之前在 深度挖掘 Laravel 生命周期 一文中,我們有去探究 Laravel 究竟是如何接收 HTTP 請(qǐng)求,又是如何生成響應(yīng)并最終呈現(xiàn)給用戶的工作原理。 本章將帶領(lǐng)大...
摘要:作者鏈接來源簡(jiǎn)書著作權(quán)歸作者所有,本文已獲得作者授權(quán)轉(zhuǎn)載,并對(duì)原文進(jìn)行了重新的排版。前言為應(yīng)用提供一個(gè)完整的容器作為依賴管理方案,是功能,模塊等功能的實(shí)現(xiàn)基礎(chǔ)。的依賴注入管理方案基于服務(wù)定位器。源碼剖析系列目錄 作者:bromine鏈接:https://www.jianshu.com/p/a23...來源:簡(jiǎn)書著作權(quán)歸作者所有,本文已獲得作者授權(quán)轉(zhuǎn)載,并對(duì)原文進(jìn)行了重新的排版。Swof...
摘要:服務(wù)通過匿名函數(shù)定義,返回一個(gè)對(duì)象的實(shí)例定義一些服務(wù)請(qǐng)注意,匿名函數(shù)可以訪問當(dāng)前容器實(shí)例,從而允許引用其他服務(wù)或參數(shù)。如果要為所有調(diào)用返回不同的實(shí)例,請(qǐng)使用方法包裝你的匿名函數(shù)。 鏈接 官網(wǎng) WebSite GitHub - Pimple 這是 Pimple 3.x 的文檔。如果你正在使用 Pimple 1.x ,請(qǐng)查看 Pimple 1.x 文檔。閱讀 Pimple 1.x ...
閱讀 3136·2023-04-26 00:40
閱讀 2496·2021-09-27 13:47
閱讀 4525·2021-09-07 10:22
閱讀 3031·2021-09-06 15:02
閱讀 3380·2021-09-04 16:45
閱讀 2574·2021-08-11 10:23
閱讀 3668·2021-07-26 23:38
閱讀 2960·2019-08-30 15:54