摘要:依賴注入依賴注入是個(gè)花俏的名詞,事實(shí)上是指類的依賴通過構(gòu)造器或在某些情況下通過方法注入。通過服務(wù)容器來管理類依賴并進(jìn)行依賴注入。其中最常見的方式叫做依賴注入,簡稱,還有一種方式叫依賴查找。也可以說,依賴被注入到對象中。
依賴注入
依賴注入是個(gè)花俏的名詞,事實(shí)上是指:類的依賴通過構(gòu)造器或在某些情況下通過「setter」方法「注入」。先看一段 Laravel 控制器里的代碼實(shí)例:
users = $users; } /** * 顯示指定 ID 的用戶。 * * @param int $id * @return View */ public function show($id) { $user_info = $this->users->find($id); return view("user", ["user_info" => $user_info]); } }
Laravel 通過服務(wù)容器來管理類依賴并進(jìn)行依賴注入。如果使用一個(gè)接口作為函數(shù)參數(shù)的類型提示,這個(gè)時(shí)候就需要將指定的實(shí)現(xiàn)綁定到接口上面:
interface EventPusher { public function send($data); }
class RedisEventPusher implements EventPusher { public function send($data) { // } }
$this->app->bind("AppContractsEventPusher", "AppServicesRedisEventPusher");
use AppContractsEventPusher; /** * 創(chuàng)建一個(gè)新的類實(shí)例。 * * @param EventPusher $pusher * @return void */ public function __construct(EventPusher $pusher) { $this->pusher = $pusher; }
這個(gè)就是所謂的面向接口編程,接口可以理解為一個(gè)規(guī)范、一個(gè)約束。高層模塊不直接依賴于低層模塊,它們都應(yīng)該依賴于抽象(指接口)。
使用依賴注入,最重要的一點(diǎn)好處就是有效的分離了對象和它所需要的外部資源,使得它們松散耦合,有利于功能復(fù)用,更重要的是使得程序的整個(gè)體系結(jié)構(gòu)變得非常靈活。
控制反轉(zhuǎn)控制反轉(zhuǎn)(Inversion of Control,縮寫為IoC),是面向?qū)ο缶幊讨械囊环N設(shè)計(jì)原則。其中**最常見的方式叫做依賴注入(Dependency Injection,簡稱DI),還有一種方式叫“依賴查找”(Dependency Lookup)。通過控制反轉(zhuǎn),對象在被創(chuàng)建的時(shí)候,由一個(gè)調(diào)控系統(tǒng)內(nèi)所有對象的外界實(shí)體,將其所依賴的對象的引用傳遞給它。也可以說,依賴被注入到對象中。
c = new C(); // 實(shí)例化創(chuàng)建C類 } public function sayC() { echo $this->c->say(); // 調(diào)用C類中的方法 } } $a = new a(); $a->sayC();
當(dāng)有了IoC/DI的容器后,A類不再主動(dòng)去創(chuàng)建C了,如下圖所示:
而是被動(dòng)等待,等待IoC/DI的容器獲取一個(gè)C的實(shí)例,然后反向的注入到A類中,如下圖所示:
c = $c; // 實(shí)例化創(chuàng)建C類 } public function sayC() { echo $this->c->say(); // 調(diào)用C類中的方法 } } $c = new C(); $a = new a(); $a->setC($c); $a->sayC();參考鏈接
類型約束
PHP 依賴注入,從此不再考慮加載順序
Java基礎(chǔ):面向?qū)ο笕筇卣?、五大原則
依賴倒置原則
PHP程序員如何理解依賴注入容器(dependency injection container)
聊一聊PHP的依賴注入(DI) 和 控制反轉(zhuǎn)(IoC)
深入探討依賴注入
服務(wù)容器
文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請注明本文地址:http://m.hztianpu.com/yun/22049.html
摘要:可以為服務(wù)提供者的方法設(shè)置類型提示。方法將在所有其他服務(wù)提供者均已注冊之后調(diào)用。所有服務(wù)提供者都在配置文件中注冊??梢赃x擇推遲服務(wù)提供者的注冊,直到真正需要注冊綁定時(shí),這樣可以提供應(yīng)用程序的性能。 本文最早發(fā)布于 Rootrl的Blog 導(dǎo)言 Laravel是一款先進(jìn)的現(xiàn)代化框架,里面有一些概念非常重要。在上手Laravel之前,我認(rèn)為先弄懂這些概念是很有必要的。你甚至需要重溫下PHP...
摘要:上面應(yīng)用依賴容器后這段代碼來自從容器中取得中服務(wù)提供者看看官方的例子注冊一個(gè)服務(wù)在容器中注冊綁定。使用綁定單例有沒有發(fā)現(xiàn)方法其實(shí)就是往依賴容器里設(shè)置一個(gè)類。然后官方文檔也說了,就是一個(gè)服務(wù)容器,聽名字也知道了其實(shí)就是依賴容器。 其實(shí)laravel中的服務(wù)容器就是一個(gè)依賴容器,依賴容器是什么,請看下文。 依賴注入 當(dāng)一個(gè)系統(tǒng)變復(fù)雜后,經(jīng)常會(huì)遇到A類需要B類的方法,B類需要C類的方法這樣的...
摘要:框架中就是使用服務(wù)容器來實(shí)現(xiàn)控制反轉(zhuǎn)和依賴注入。容器依賴注入的實(shí)現(xiàn)實(shí)現(xiàn)原理需要了解的知識點(diǎn)閉包匿名函數(shù)匿名函數(shù),也叫閉包函數(shù),允許臨時(shí)創(chuàng)建一個(gè)沒有指定名稱的函數(shù)反射以上版本具有完整的反射,添加了對類接口函數(shù)方法和擴(kuò)展進(jìn)行反向工程的能力。 前言 通過實(shí)現(xiàn)laravel 框架功能,以便深入理解laravel框架的先進(jìn)思想。 什么是服務(wù)容器 服務(wù)容器是用來管理類依賴與運(yùn)行依賴注入的工具。La...
摘要:控制反轉(zhuǎn)容器控制反轉(zhuǎn)使依賴注入變得更加便捷。有瑕疵控制反轉(zhuǎn)容器是實(shí)現(xiàn)的控制翻轉(zhuǎn)容器的一種替代方案。容器的獨(dú)立使用即使沒有使用框架,我們?nèi)匀豢梢栽陧?xiàng)目中使用安裝組件來使用的控制反轉(zhuǎn)容器。在沒有給定任何信息的情況下,容器是無法實(shí)例化相關(guān)依賴的。 聲明:本文并非博主原創(chuàng),而是來自對《Laravel 4 From Apprentice to Artisan》閱讀的翻譯和理解,當(dāng)然也不是原汁原味...
摘要:引述最近看設(shè)計(jì)模式以及代碼,對于控制反轉(zhuǎn)以及依賴注入這些概念非常困惑,于是找了一些資料,以下是對于控制反轉(zhuǎn)的一下理解。其中最常見的方式叫做依賴注入,簡稱,還有一種方式叫依賴查找。在軟件工程中,依賴注入是種實(shí)現(xiàn)控制反轉(zhuǎn)用于解決依賴性設(shè)計(jì)模式。 引述 最近看設(shè)計(jì)模式以及l(fā)aravel代碼,對于控制反轉(zhuǎn)以及依賴注入這些概念非常困惑,于是找了一些資料,以下是對于控制反轉(zhuǎn)的一下理解。 概念 Io...
閱讀 1541·2021-11-24 09:39
閱讀 1846·2021-11-22 15:25
閱讀 3816·2021-11-19 09:40
閱讀 3358·2021-09-22 15:31
閱讀 1373·2021-07-29 13:49
閱讀 1309·2019-08-26 11:59
閱讀 1382·2019-08-26 11:39
閱讀 987·2019-08-26 11:00