go 依賴注入 哪個好 PHP的依賴注入 DI

2021-10-17 09:41:55 字數 1849 閱讀 6189

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依賴注入

依然是來自到喜啦的一道面試題,你知道什麼是依賴注入嗎?依賴注入 di 的概念雖然聽起來很深奧,但是如果你用過一些新興的php框架的話,對於di一定不陌生,因為它們多多少少都用到了依賴注入來處理類與類之間的依賴關係。class a 為什麼這種方案不可取呢?因為這樣的話,a與b就耦合在了一起,也就是說a...

php 依賴注入 資料庫切換 PHP依賴注入的含義

依賴注入其實本質上是指對類的依賴通過構造器完成自動注入,例如在控制器架構方法和操作方法中一旦對引數進行物件型別約束則會自動觸發依賴注入,由於訪問控制器的引數都來自於url請求,普通變數就是通過引數繫結自動獲取,物件變數則是通過依賴注入生成。控制器 class debug public functio...

php 依賴注入的實現

當a類需要依賴於b類,也就是說需要在a類中例項化b類的物件來使用時候,如果b類中的功能發生改變,也會導致a類中使用b類的地方也要跟著修改,導致a類與b類高耦合。這個時候解決方式是,a類應該去依賴b類的介面,把具體的類的例項化交給外部。為了約束我們先定義乙個訊息介面 inte ce message i...