當前位置:首頁 » 編程語言 » php依賴注入

php依賴注入

發布時間: 2025-03-09 14:20:57

『壹』 PHP Ding簡介

Ding是一個輕量級的PHP框架,支持依賴注入、面向方面編程,並以MVC模式為基礎,具有快速、簡潔的特點。它提供了一系列功能,包括syslog、TCP套接字的非阻塞客戶端和伺服器端操作、定時器、自定義錯誤處理、信號與異常處理,以及對PAGI和PAMI的集成。這些特性使其在功能上與Java的Spring框架類似。

Ding框架注重簡化開發過程,讓開發者能夠更高效地構建Web應用。依賴注入機制幫助開發者在運行時注入服務和組件,增強代碼的可維護性和可測試性。面向方面編程(AOP)則允許開發者將橫切關注點(如日誌記錄、事務管理)從核心業務邏輯中分離出來,以提高代碼的清晰度和可重用性。

在性能方面,Ding實現了非阻塞I/O操作,利用syslog和TCP套接字技術提高網路通信效率,這對於實時應用和高並發場景尤為關鍵。定時器功能讓開發者能夠輕松實現任務的定時執行,滿足各類定時需求。自定義錯誤處理機制增強了系統的健壯性,使錯誤處理更加靈活和針對性。信號與異常處理機制確保了程序在遇到異常情況時能夠優雅地退出或進行適當的錯誤恢復。

Ding還提供了與PAGI和PAMI的集成,這為構建與語音或媒體相關的應用提供了便利。PAGI和PAMI是用於構建電話應用的API,Ding的集成使得開發者能夠輕松地將這些功能融入到基於PHP的應用中。

綜上所述,Ding框架通過提供豐富的功能集、高效的性能優化和靈活的編程模型,為PHP開發者提供了一種高效構建復雜應用的解決方案,類似於Java的Spring框架。

『貳』 怎樣在PHP中更好的實現解耦

二、實現解耦兩種方式
對於傳統的PHP框架,我們很難把這個框架里某個需要的組件提取出來單獨使用。因為這個組件可能會用到Logger對象、Config對象等等其他別的什麼對象,而且這些外部依賴的代碼是寫死在源代碼里的。有時候想單獨使用框架內部的某個功能,不得不寫大量的移植代碼。要實現一個高度解耦的PHP框架,需要參考一下服務定位和依賴注入兩種模式。在Zend framework2.0里,底層實現了DI,上層又按照SL封裝了一個ServiceManager。

有人說Service Locator是一種反模式,因為在代碼中使用Service Locator也算是一種隱含的外部依賴關系。其實這是矯情,難道在代碼中使用IoC容器就不是外部依賴么?問題在於在恰當的場合使用恰當的模式。
首先要搞清楚代碼究竟是屬於「調用者」還是屬於「被調用者」。作為「被調用者」,比如某個模塊,可以預見到代碼會被使用在不同場合,當然是對外部的耦合越小越好,對於自己所需要的外部介面,完全可以依賴外部「調用者」來被動注入;但對於的「調用者」代碼來說,作為最終的應用層代碼,需要做到統籌全局,當然是不可避免地要直接與各個組件產生耦合了。
至於什麼時候用依賴注入,什麼時候用服務定位,我個人的看法著這樣的:編寫組件時,最好使用依賴注入模式,特別是當這個組件可能被用於不同的項目工程中時;編寫應用層代碼、或者項目平台相關性強的組件時,可以使用服務定位模式。另外,依賴注入的外部介面對於組件來說應該是強依賴的,組件缺少這些外部介面是無法獨立運行的;服務定位取得的外部介面應該是弱依賴的,在缺少介面的情況下,組件也能勉強運行。舉個例子:用戶模型組件在完成用戶注冊的過程中,會用到兩個外部介面,一個是數據訪問層介面,用於將用戶信息保存到資料庫或別的永久儲存介質里,另一個是郵件發送介面,用於向用戶郵箱發送一封注冊確認信。其中數據訪問層介面對於用戶模型組件是強依賴關系,後者缺了前者將無法正常運行;而郵件發送介面對於用戶模型組件是弱依賴關系,沒有這個介面也能完成用戶注冊過程,只不過會產生一些警告信息。

『叄』 PHP中什麼是依賴注入

依賴注入可能是我所知道的最簡單設計模式之一,很多情況下可能你無意識中已經使用了依賴注入。不過它也是最難解釋的一個。我認為有一部分原因是由於大多數介紹依賴注入的例子缺乏實際意義,讓人難理解。因為PHP主要用於Web開發,那就先來看一個簡單的web開發實例。
HTTP本身是一個無狀態的連接協議,為了支持客戶在發起WEB請求時應用程序能存儲用戶信息,我們就需要通過一種技術來實現存儲狀態交互。理所當然最簡單的是使用cookie,更好的方式是PHP內置的Session機制。
$_SESSION['language'] = 'fr';
上面代碼將用戶語言存儲在了名為language的Session變數中,因此在該用戶隨後的請求中,可以通過全局數組$_SESSION來獲取language:
$user_language = $_SESSION['language'];
依賴注入主要用於面向對像開發,現在讓我們假設我們有一個SessionStorage類,該類封裝了PHP Session機制:
class SessionStorage
{
function __construct($cookieName = 'PHP_SESS_ID')
{
session_name($cookieName);
session_start();
}
function set($key, $value)
{
$_SESSION[$key] = $value;
}
function get($key)
{
return $_SESSION[$key];
}
// ...
}
同時還有一個User類提供了更高級的封裝:
class User
{
protected $storage;
function __construct()
{
$this->storage = new SessionStorage();
}
function setLanguage($language)
{
$this->storage->set('language', $language);
}
function getLanguage()
{
return $this->storage->get('language');
}
// ...
}
代碼很簡單,同樣使用User類也很簡單:
$user = new User();
$user->setLanguage('fr');
$user_language = $user->getLanguage();
一切都很美好,除非你的程序需要更好的擴展性。假設現在你想要更改保存session_id的COOKIE鍵值,以下有一些可供選擇的方法:
User類中創建SessionStorage實例時,在SessionStorage構造方法中使用字元串』SESSION_ID』硬編碼:
class User
{
function __construct()
{
$this->storage = new SessionStorage('SESSION_ID');
}
// ...
}
在User類外部設置一個常量(名為STORAGE_SESSION_NAME)
class User
{
function __construct()
{
$this->storage = new SessionStorage(STORAGE_SESSION_NAME);
}
// ...
}
define('STORAGE_SESSION_NAME', 'SESSION_ID');
通過User類構造函數中的參數傳遞Session name
class User
{
function __construct($sessionName)
{
$this->storage = new SessionStorage($sessionName);
}
// ...
}
$user = new User('SESSION_ID');
還是通過User類構造函數中的參數傳遞Session name,不過這次參數採用數組的方式
class User
{
function __construct($storageOptions)
{
$this->storage = new SessionStorage($storageOptions['session_name']);
}
// ...
}
$user = new User(array('session_name' => 'SESSION_ID'));
上面的方式都很糟糕。
在user類中硬編碼設置session name的做法沒有真正解決問題,如果以後你還需要更改保存session_id的COOKIE鍵值,你不得不再一次修改user類(User類不應該關心COOKIE鍵值)。
使用常量的方式同樣很糟,造成User類依賴於一個常量設置。
通過User類構造函數的參數或數組來傳遞session name相對來說好一些,不過也不完美,這樣做干擾了User類構造函數的參數,因為如何存儲Session並不是User類需要關心的,User類不應該和它們扯上關聯。
另外,還有一個問題不太好解決:我們如何改變SessionStorage類。這種應用場景很多,比如你要用一個Session模擬類來做測試,或者你要將Session存儲在資料庫或者內存中。目前這種實現方式,在不改變User類的情況下,很難做到這點。
現在,讓我們來使用依賴注入。回憶一下,之前我們是在User類內部創建SessionStorage對像的,現在我們修改一下,讓SessionStorage對像通過User類的構造函數傳遞進去。
class User
{
function __construct($storage)
{
$this->storage = $storage;
}
// ...
這就是依賴注入最經典的案例,沒有之一。現在使用User類有一些小小的改變,首先你需要創建SessionStorage對像。
$storage = new SessionStorage('SESSION_ID');
$user = new User($storage);
現在,配置session存儲對像很簡單了,同樣如果改變session存儲對像也很簡單,所有這一切並不需要去更新User類,降低了業務類之間的耦合。
Pico Container 的網站上是這樣描述依賴注入:
依賴注入是通過類的構造函數、方法、或者直接寫入的方式,將所依賴的組件傳遞給類的方式。
所以依賴注入並不只限於通過構造函數注入。下面來看看幾種注入方式:
構造函數注入
class User
{
function __construct($storage)
{
$this->storage = $storage;
}
// ...
}
setter方法注入
class User
{
function setSessionStorage($storage)
{
$this->storage = $storage;
}
// ...
}
屬性直接注入
class User
{
public $sessionStorage;
}
$user->sessionStorage = $storage;
根據經驗,一般通過構造函數注入的是強依賴關系的組件,setter方式用來注入可選的依賴組件。
現在,大多數流行的PHP框架都採用了依賴注入的模式實現業務組件間的高內聚低耦合。
// symfony: 構造函數注入的例子
$dispatcher = new sfEventDispatcher();
$storage = new sfMySQLSessionStorage(array('database' => 'session', 'db_table' => 'session'));
$user = new sfUser($dispatcher, $storage, array('default_culture' => 'en'));
// Zend Framework: setter方式注入的例子
$transport = new Zend_Mail_Transport_Smtp('smtp.gmail.com', array(
'auth' => 'login',
'username' => 'foo',
'password' => 'bar',
'ssl' => 'ssl',
'port' => 465,
));
$mailer = new Zend_Mail();
$mailer->setDefaultTransport($transport);

熱點內容
天正建築編譯菜單文件一直在載入 發布:2025-03-10 01:47:37 瀏覽:565
長安cx70自動擋有哪些配置 發布:2025-03-10 01:35:54 瀏覽:990
百灑存儲 發布:2025-03-10 01:35:43 瀏覽:946
cf鬼跳腳本 發布:2025-03-10 01:33:34 瀏覽:177
python容錯 發布:2025-03-10 01:19:53 瀏覽:264
android招聘鄭州 發布:2025-03-10 01:06:37 瀏覽:110
手機問道腳本 發布:2025-03-10 01:06:37 瀏覽:167
網易大唐無雙手游專業腳本 發布:2025-03-10 00:52:13 瀏覽:78
王者榮耀安卓qq區戰區位置哪個最低 發布:2025-03-10 00:44:18 瀏覽:639
訪問手機內部存儲 發布:2025-03-10 00:35:10 瀏覽:847