這篇文章主要介紹了關於聊聊框架開發的依賴注入,容器與外觀模式(上部),有著一定的參考價值,現在分享給大家,有需要的朋友可以參考一下
#一、依賴注入與解藕
熱戀中的男女,經常會說,離開你,我就活不下去了,這是多麼深的依賴呀~~
編程中的依賴,與我們生活中的依賴,本質是一樣的:我的工作,離不開你的支持,沒有你,就沒有我。
依賴有二種: 一是功能上,二是順序上的,下面我們用實例來進行說明:
我們現在有這樣的一個任務:
使用者登入操作
1.涉及資料庫操作,資料驗證,模板輸出;
2.分別對應Db類別,Validate類別,View類別;
3.僅做示範,具體實例請同學們自行完成;
在正式編碼前,先簡單了解一下什麼是客戶端?
1. 客戶端:只要能發起請求,都可以看作客戶端,瀏覽器,一段程式碼都可以
2. 以下的程式碼,在實例化User類別,並調用其內部的loign方法進行工作
3. 所以,$user = new User();就是客戶端程式碼
4. 或者,也可以這樣理解,凡寫在類別或函數等程式碼之外的,都可看作客戶端
原始碼如下:
<?php //数据库操作类 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中文網其他相關文章!