摘要:在方法中需要傳入一個我們可以傳入一個實例對象或者是一個閉包函數(shù)??梢钥吹轿疫@全使用的是閉包函數(shù),其實也可以這樣寫后面這種寫法與閉包相比的區(qū)別就是我們需要先實例化對象才能往容易中綁定服務(wù)。
依賴注入
當(dāng)A類需要依賴于B類,也就是說需要在A類中實例化B類的對象來使用時候,如果B類中的功能發(fā)生改變,也會導(dǎo)致A類中使用B類的地方也要跟著修改,導(dǎo)致A類與B類高耦合。這個時候解決方式是,A類應(yīng)該去依賴B類的接口,把具體的類的實例化交給外部。
就拿我們業(yè)務(wù)中常用的通知模塊來說。
messager = new Message(); } public function seed_msg() { return $this->messager->seed(); } } $Order = new Order(); $Order->seed_msg();
上面的代碼是我們傳統(tǒng)的寫法。首先由個消息發(fā)送的類。然后在我們需要發(fā)送消息的地方,調(diào)用發(fā)送消息的接口。有一天你需要添加一個發(fā)送短信的接口以滿足不同的需求。那么你會發(fā)現(xiàn)你要再Message類里面做修改。同樣也要再Order類里面做修改。這樣就顯得很麻煩。這個時候就有了依賴注入的思路。下面把代碼做一個調(diào)整
messager = $message; } public function seed_msg() { return $this->messager->seed(); } } //我們需要發(fā)送郵件的時候 $message = new SeedEmail(); //將郵件發(fā)送對象作為參數(shù)傳遞給Order $Order = new Order($message); $Order->seed_msg(); //我們需要發(fā)送短信的時候 $message = new SeedSMS(); $Order = new Order($message); $Order->seed_msg();
這樣我們就實現(xiàn)了依賴注入的思路,是不是很方便擴展了。
服務(wù)容器我理解的服務(wù)容器就是一個自動產(chǎn)生類的工廠。
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)建一個消息工廠 $message = new Container(); //將發(fā)送短信注冊綁定到工廠里面 $message->bind("SMS",function (){ return new SeedSMS(); }); //將發(fā)送郵件注冊綁定到工廠 $message->bind("EMAIL",function (){ return new SeedEmail(); }); //需要發(fā)送短信的時候 $SMS = $message->make("SMS"); $SMS->seed();
container是一個簡單的服務(wù)容器里面有bind,make兩個方法
bind是向容器中綁定服務(wù)對象。make則是從容器中取出對象。
在bind方法中需要傳入一個 concrete 我們可以傳入一個實例對象或者是一個閉包函數(shù)。
可以看到我這全使用的是閉包函數(shù),其實也可以這樣寫
$sms = new SeedSMS(); $message->bind("SMS",$sms);
后面這種寫法與閉包相比的區(qū)別就是我們需要先實例化對象才能往容易中綁定服務(wù)。而閉包則是我們使用這個服務(wù)的時候才去實例化對象??梢钥闯鲩]包是有很多的優(yōu)勢的。
makemake方法就從容器中出去方法。里面首先判斷了instances變量中是否有當(dāng)前以及存在的服務(wù)對象,如果有直接返回。如果沒有那么會通過 call_user_func_array返回一個對象。call_user_func_array的使用可以查看
PHP 中 call_user_func 的使用
原文地址
文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請注明本文地址:http://www.ezyhdfw.cn/yun/28945.html
摘要:而依賴倒置原則的思想是,上層不應(yīng)該依賴下層,應(yīng)依賴接口。上面通過構(gòu)造函數(shù)注入對象的方式,就是最簡單的依賴注入當(dāng)然注入不僅可以通過構(gòu)造函數(shù)注入,也可以通過屬性注入,上面你可以通過一個來動態(tài)為這個屬性賦值。 依賴倒置和控制反轉(zhuǎn)是一種編程思想,而依賴注入就是通過服務(wù)容器實現(xiàn)這種面向接口或者是面向抽象編程的思想 概念理解 依賴倒置原則 依賴倒置是一種軟件設(shè)計思想,在傳統(tǒng)軟件中,上層代碼依賴于下...
摘要:依賴注入容器管理應(yīng)用程序中的全局對象包括實例化處理依賴關(guān)系。為了解決這樣的問題,我們再次回到全局注冊表創(chuàng)建組件。參考文章程序員如何理解依賴注入容器補充很多代碼背后,都是某種哲學(xué)思想的體現(xiàn)。 思想 思想是解決問題的根本思想必須轉(zhuǎn)換成習(xí)慣構(gòu)建一套完整的思想體系是開發(fā)能力成熟的標(biāo)志——《簡單之美》(前言) . 成功的軟件項目就是那些提交產(chǎn)物達(dá)到或超出客戶的預(yù)期的項目,而且開發(fā)過程符合時間和費...
摘要:可以為服務(wù)提供者的方法設(shè)置類型提示。方法將在所有其他服務(wù)提供者均已注冊之后調(diào)用。所有服務(wù)提供者都在配置文件中注冊。可以選擇推遲服務(wù)提供者的注冊,直到真正需要注冊綁定時,這樣可以提供應(yīng)用程序的性能。 本文最早發(fā)布于 Rootrl的Blog 導(dǎo)言 Laravel是一款先進(jìn)的現(xiàn)代化框架,里面有一些概念非常重要。在上手Laravel之前,我認(rèn)為先弄懂這些概念是很有必要的。你甚至需要重溫下PHP...
摘要:框架中就是使用服務(wù)容器來實現(xiàn)控制反轉(zhuǎn)和依賴注入。容器依賴注入的實現(xiàn)實現(xiàn)原理需要了解的知識點閉包匿名函數(shù)匿名函數(shù),也叫閉包函數(shù),允許臨時創(chuàng)建一個沒有指定名稱的函數(shù)反射以上版本具有完整的反射,添加了對類接口函數(shù)方法和擴展進(jìn)行反向工程的能力。 前言 通過實現(xiàn)laravel 框架功能,以便深入理解laravel框架的先進(jìn)思想。 什么是服務(wù)容器 服務(wù)容器是用來管理類依賴與運行依賴注入的工具。La...
摘要:構(gòu)造器注入實現(xiàn)特定參數(shù)的構(gòu)造函數(shù),在新建對象時傳入所依賴類型的對象。 基本概念 1.依賴倒置(反轉(zhuǎn))原則(DIP):一種軟件架構(gòu)設(shè)計的原則(抽象概念,是一種思想)在面向?qū)ο缶幊填I(lǐng)域中,依賴反轉(zhuǎn)原則(Dependency inversion principle,DIP)是指一種特定的解耦(傳統(tǒng)的依賴關(guān)系創(chuàng)建在高層次上,而具體的策略設(shè)置則應(yīng)用在低層次的模塊上)形式,使得高層次的模塊不依賴于...
閱讀 2899·2021-11-17 09:33
閱讀 2294·2021-09-03 10:40
閱讀 606·2019-08-29 18:45
閱讀 3024·2019-08-29 16:21
閱讀 670·2019-08-29 11:11
閱讀 3457·2019-08-26 12:00
閱讀 3024·2019-08-23 18:19
閱讀 1156·2019-08-23 12:18