首頁 >後端開發 >php教程 >聊聊框架開發的依賴注入,容器與外觀模式(上部)

聊聊框架開發的依賴注入,容器與外觀模式(上部)

不言
不言原創
2018-07-14 11:53:231511瀏覽

這篇文章主要介紹了關於聊聊框架開發的依賴注入,容器與外觀模式(上部),有著一定的參考價值,現在分享給大家,有需要的朋友可以參考一下

#一、依賴注入與解藕

熱戀中的男女,經常會說,離開你,我就活不下去了,這是多麼深的依賴呀~~

編程中的依賴,與我們生活中的依賴,本質是一樣的:我的工作,離不開你的支持,沒有你,就沒有我。

依賴有二種: 一是功能上,二是順序上的,下面我們用實例來進行說明:

我們現在有這樣的一個任務:

使用者登入操作

1.涉及資料庫操作,資料驗證,模板輸出;

2.分別對應Db類別,Validate類別,View類別;

3.僅做示範,具體實例請同學們自行完成;

在正式編碼前,先簡單了解一下什麼是客戶端?

1. 客戶端:只要能發起請求,都可以看作客戶端,瀏覽器,一段程式碼都可以

2. 以下的程式碼,在實例化User類別,並調用其內部的loign方法進行工作

3. 所以,$user = new User();就是客戶端程式碼

4. 或者,也可以這樣理解,凡寫在類別或函數等程式碼之外的,都可看作客戶端

原始碼如下:

<?php 
//数据库操作类
class Db
{
//数据库连接
public function connect()
{
return &#39;数据库连接成功<br>&#39;;
}
}
//数据验证类
class Validate
{
//数据验证
public function check()
{
return &#39;数据验证成功<br>&#39;;
}
}
//视图图
class View
{
//内容输出
public function display()
{
return &#39;用户登录成功&#39;;
}
}
//用户类
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 &#39;数据库连接成功<br>&#39;;
}
}
//数据验证类
class Validate
{
//数据验证
public function check()
{
return &#39;数据验证成功<br>&#39;;
}
}
//视图图
class View
{
//内容输出
public function display()
{
return &#39;用户登录成功&#39;;
}
}
//用户类
class User
{
//创建三个成员属性,用来保存本类所依赖的对象
protected $db = null;
protected $validate = null;
protected $view = &#39;&#39;;
//用户登录操作
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 &#39;<h3>用依赖注入进行解藕:</h3>&#39;;
echo $user->login($db, $validate, $view);

雖然將依賴類別的實例化前移到客戶端,但解決了類別之間的依賴問題

但仍存在以下幾個問題:

1.為了讓工作類別User正常工具,必須事先在外部將所需的類別全部事先實例化;

2 .只要涉及實例化,就要求客戶端(調用者)必須對這些依賴類的細節非常了解,例如參數與返回值

那麼能不能讓用戶把實例化依賴類的步驟都省略掉呢?這樣豈不是更好,更簡單

我們呼叫外部依賴類別,只要給一個類別名稱,以及一個創建該類別實例的方法(建構器)就可以了呢?

即: 我們只給出:  類別名稱, 創建類別實例的方法,其它一概不管

下面我們通過的"容器技術"來這現這種傻瓜式的解藕過程

#以上就是本文的全部內容,希望對大家的學習有所幫助,更多相關內容請關注PHP中文網!

相關推薦:

聊聊框架開發的依賴注入,容器與外觀模式(下部)

#

以上是聊聊框架開發的依賴注入,容器與外觀模式(上部)的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn