一、依賴注入與解藕
熱戀中的男女,經常會說,離開你,我就活不下去了,這是多么深的依賴呀~~
編程中的依賴,與我們生活中的依賴,本質是一樣的:我的工作,離不開你的支持,沒有你,就沒有我。
依賴有二種: 一是功能上,二是順序上的,下面我們用實例來進行說明:
我們現在有這樣的一個任務:
用戶登錄操作
1.涉及數據庫操作,數據驗證,模板輸出;
2.分別對應Db類,Validate類,View類;
3.僅做演示,具體實例請同學們自行完成;
在正式編碼前,先簡單了解一下什么是客戶端?
1. 客戶端:只要能發起請求,都可以看作客戶端,瀏覽器,一段代碼都可以
2. 以下的代碼,在實例化User類,并調用其內部的loign方法進行工作
3. 所以,$user = new User();就是客戶端代碼
4. 或者,也可以這樣理解,凡寫在類或函數等代碼之外的,都可看作客戶端
源碼如下:
?php //數據庫操作類html' target='_blank'>class Db//數據庫連接public function connect()return 數據庫連接成功 br //數據驗證類class Validate//數據驗證public function check()return 數據驗證成功 br //視圖圖class View//內容輸出public function display()return 用戶登錄成功 //用戶類class User//用戶登錄操作public function login()//實例化Db類并調用connect()連接數據庫$db = new Db();echo $db- connect();//實例化Validate類并調用check()進行數據驗證$validate = new Validate();echo $validate- check();//實例化視圖類并調用display()顯示運行結果$view = new View();echo $view- display();//創建User類$user = new User();//調用User對象的login方法進行登錄操作echo $user- login();
以上代碼盡管可以正常工作,但仍存在以下問題:
1. 以上的四個類,只有User是實際工作類,其它三個都是工具類(Db,Validate,View)
2. 工作類中調用的工具類一旦發生變化,必須修改對這些工具類的所有引用代碼,例如Db參數變化
3. 工作類的調用者必須對要用到的所有工具類,非常熟悉,對參數與返回值必須了解
4. 工作類對以上三個工具類,形成了嚴重的依賴,也叫類之間嚴重耦合
下面我們通過最常用的依賴注入(DI)來解藕
我們先了解一下解藕的基本思路:
1.依賴注入并不神性
2.本質上來說,就是對工具類的實例化不在工作類中完成,而是在工作類之外,即客戶端完成
3.由于工具類實例化在客戶端完成,所在在工作類中,必須要有接收器用來保存實例化的工具對象
4.此時,用戶就可以將在客戶端已經實例化好的工具對象,以參數的方式直接傳遞給工作類的方法
5.這種由外部直接將對象傳入到當前工作類的方式,就叫依賴注入
源碼如下:
?php//數據庫操作類class Db//數據庫連接public function connect()return 數據庫連接成功 br //數據驗證類class Validate//數據驗證public function check()return 數據驗證成功 br //視圖圖class View//內容輸出public function display()return 用戶登錄成功 //用戶類class User//創建三個成員屬性,用來保存本類所依賴的對象protected $db = null;protected $validate = null;protected $view = //用戶登錄操作public function login(Db $db, Validate $validate, View $view)//實例化Db類并調用connect()連接數據庫// $db = new Db();echo $db- connect();//實例化Validate類并調用check()進行數據驗證// $validate = new Validate();echo $validate- check();//實例化視圖類并調用display()顯示運行結果// $view = new View();echo $view- display();//在客戶端完成工具類的實例化(即工具類實例化前移)$db = new Db();$validate = new Validate();$view = new View();//創建User類$user = new User();//調用User對象的login方法進行登錄操作// echo $user- login();// 將該類依賴的外部對象以參數方式注入到當前方法中,當然,推薦以構造器方式注入最方便echo h3 用依賴注入進行解藕: /h3 echo $user- login($db, $validate, $view);
雖然將依賴類的實例化前移到客戶端,但解決了類之間的依賴問題
但是仍存在以下幾個問題:
1.為了使工作類User正常工具,必須事先在外部將所需要的類全部事先實例化;
2.只要涉及實例化,就要求客戶端(調用者)必須對這些依賴類的細節非常了解,例如參數與返回值
那么能不能讓用戶把實例化依賴類的步驟都省略掉呢?這樣豈不是更好,更簡單
我們調用外部依賴類,只要給一個類名,以及一個創建該類實例的方法(構造器)就可以了呢?
即: 我們只給出: 類名, 創建類實例的方法,其它一概不管
下面我們通過的 容器技術 來這現這種傻瓜式的的解藕過程
以上就是本文的全部內容,希望對大家的學習有所幫助,更多相關內容請關注PHP !
相關推薦:
聊聊框架開發的依賴注入,容器與外觀模式(下部)
以上就是聊聊框架開發的依賴注入,容器與外觀模式(上部)的詳細內容,PHP教程
鄭重聲明:本文版權歸原作者所有,轉載文章僅為傳播更多信息之目的,如作者信息標記有誤,請第一時間聯系我們修改或刪除,多謝。
新聞熱點
疑難解答