依賴注入的三種方式 PHP的依賴注入 DI

2021-10-11 14:14:16 字數 1849 閱讀 9768

php當中的依賴注入和控制反轉是面試中經常問到的問題。同時,很多框架中也使用到了這種設計模式,可能有很多小夥伴們對這兩個概念認識比較模糊,下面我就來給大家講講什麼是依賴注入。

概念:是一種允許我們從硬編碼的依賴中解耦出來,從而在執行時或者編譯時能夠修改的軟體設計模式。

說明:要想理解di(依賴注入),首先要明白在php中是如何傳遞依賴關係的。

php中傳遞依賴關係的三種方式:

①在a類中直接new乙個b類,**如下:

<?php //宣告乙個類b    class b    }    //宣告乙個類a(假設a類想實現某個功能,要依賴b類來實現)    class a    }    //建立乙個a類的物件    $obj = new a();    //呼叫a類的測試方法    $obj->totest();
說明:這是一種最不可取的方案,這樣的話a和b就耦合在一起了,也就是a類無法脫離b類而工作。②在a類的方法中傳入需要的b類,**如下:

<?php //宣告乙個類bclass b}//宣告乙個類a(假設a類想實現某個功能,要依賴b類來實現)class a    //宣告乙個測試方法    public function totest()}//建立乙個a類的物件$obj = new a(new b());//呼叫a類的測試方法$obj->totest();
說明:這種方式比第一種方式改進了不少,a類不必和b類**在一起,只要傳入的類滿足a類的需求,也可以是c類,也可以是d類等等。但是這種方案的弊端在於如果a類依賴的類較多,引數列表會很長,容易發生混亂。③使用set方法傳入,**如下:

<?php //宣告乙個類bclass b}//宣告乙個類a(假設a類想實現某個功能,要依賴b類來實現)class a    public function go()}//建立乙個a類的物件$obj = new a();//呼叫a類的測試方法(這個地方可以使用單例模式)$obj->set(new b());//呼叫go方法$obj->go();
說明:這種方法比第一種方法有了改進,a類不必與b類**在一起,只要傳入的類滿足a類的需求,也可以是c類,也可以是d類等等。但是這種方案的弊端在於如果a類依賴的類較多,引數列表會很長,容易發生混亂,和第二種方案存在同樣的弊端。當依賴的類增多時,我們會需要很多的set方法。這個時候,我們如果有乙個專門的類(或者說乙個容器)可以幫我們管理這些依賴關係就好了--依賴注入

<?php //宣告乙個容器類,用來注入物件class container    //宣告乙個方法,用來獲取物件    function get($k)    }//宣告乙個db類class db}//宣告乙個cache類class cache    //宣告乙個方法    public function dosomething($str)}//建立乙個container物件$container = new container();//在容器中注入兩個類$container->set('db', new db());$container->set('cache', new cache($container));//執行對應的方法$container->get('cache')->dosomething('db');
說明:這樣是不是就好多了,不會出現上面三種情況的問題了呢?希望小夥伴們自己也嘗試一下,體驗一下,依賴注入設計模式的魅力吧!

php依賴注入的三種方式

控制反轉 inversion of control,縮寫為ioc 是物件導向程式設計中的一種設計原則,可以用來減低計算機 之間的耦合度。其中最常見的方式叫做依賴注入 dependency injection,簡稱di 下面我們就為大家介紹一下php依賴注入的三種方式。一 構造器注入 將被依賴物件通過...

依賴注入的三種方式

依賴注入 為ioc別名,依賴注入是ioc的實現方式,ioc本質是將物件的建立由程式轉移到容器,依賴注入為實現這一目標的方式。1 構造方法注入 即被注入物件可以通過在其構造方法中宣告依賴物件的引數列表,讓外部 通常是ioc容器 知道它需要哪些依賴物件,然後ioc容器會檢查被注入物件的構造方法,取得其所...

依賴注入的三種方式

下面介紹三種方式,將被依賴物件注入給依賴類。將被依賴物件通過建構函式的引數注入給依賴物件,並且在初始化物件的時候注入。物件初始化完成後便可獲得可使用的物件。當需要注入的物件很多時,構造器引數列表將會很長 不夠靈活。若有多種注入方式,每種方式只需注入指定幾個依賴,那麼就需要提供多個過載的建構函式,麻煩...