php 依赖注入框架,依赖注入模式(Dependency Injection)
依賴注入模式(Dependency Injection)
由 學(xué)院君 創(chuàng)建于5年前, 最后更新于 10個(gè)月前
版本號 #3
18333 views
16 likes
0 collects
1、模式定義
依賴注入(Dependency Injection)是控制反轉(zhuǎn)(Inversion of Control)的一種實(shí)現(xiàn)方式。
我們先來看看什么是控制反轉(zhuǎn)。
當(dāng)調(diào)用者需要被調(diào)用者的協(xié)助時(shí),在傳統(tǒng)的程序設(shè)計(jì)過程中,通常由調(diào)用者來創(chuàng)建被調(diào)用者的實(shí)例,但在這里,創(chuàng)建被調(diào)用者的工作不再由調(diào)用者來完成,而是將被調(diào)用者的創(chuàng)建移到調(diào)用者的外部,從而反轉(zhuǎn)被調(diào)用者的創(chuàng)建,消除了調(diào)用者對被調(diào)用者創(chuàng)建的控制,因此稱為控制反轉(zhuǎn)。
要實(shí)現(xiàn)控制反轉(zhuǎn),通常的解決方案是將創(chuàng)建被調(diào)用者實(shí)例的工作交由?IoC 容器來完成,然后在調(diào)用者中注入被調(diào)用者(通過構(gòu)造器/方法注入實(shí)現(xiàn)),這樣我們就實(shí)現(xiàn)了調(diào)用者與被調(diào)用者的解耦,該過程被稱為依賴注入。
依賴注入不是目的,它是一系列工具和手段,最終的目的是幫助我們開發(fā)出松散耦合(loose coupled)、可維護(hù)、可測試的代碼和程序。這條原則的做法是大家熟知的面向接口,或者說是面向抽象編程。
2、UML 類圖
3、示例代碼
在本例中,我們在 Connection 類(調(diào)用者)的構(gòu)造方法中依賴注入 Parameters 接口的實(shí)現(xiàn)類(被調(diào)用者),如果不使用依賴注入的話,則必須在 Connection 中創(chuàng)建該接口的實(shí)現(xiàn)類實(shí)例,這就形成緊耦合代碼,如果我們要切換成該接口的其它實(shí)現(xiàn)類則必須要修改代碼,這對到測試和擴(kuò)展而言都是極為不利的。
AbstractConfig.php
namespace DesignPatterns\Structural\DependencyInjection;
/**
* AbstractConfig類
*/
abstract class AbstractConfig
{
/**
* @var Storage of data
*/
protected $storage;
public function __construct($storage)
{
$this->storage = $storage;
}
}
Parameters.php
namespace DesignPatterns\Structural\DependencyInjection;
/**
* Parameters接口
*/
interface Parameters
{
/**
* 獲取參數(shù)
*
* @param string|int $key
*
* @return mixed
*/
public function get($key);
/**
* 設(shè)置參數(shù)
*
* @param string|int $key
* @param mixed $value
*/
public function set($key, $value);
}
ArrayConfig.php
namespace DesignPatterns\Structural\DependencyInjection;
/**
* ArrayConfig類
*
* 使用數(shù)組作為數(shù)據(jù)源
*/
class ArrayConfig extends AbstractConfig implements Parameters
{
/**
* 獲取參數(shù)
*
* @param string|int $key
* @param null $default
* @return mixed
*/
public function get($key, $default = null)
{
if (isset($this->storage[$key])) {
return $this->storage[$key];
}
return $default;
}
/**
* 設(shè)置參數(shù)
*
* @param string|int $key
* @param mixed $value
*/
public function set($key, $value)
{
$this->storage[$key] = $value;
}
}
Connection.php
namespace DesignPatterns\Structural\DependencyInjection;
/**
* Connection類
*/
class Connection
{
/**
* @var Configuration
*/
protected $configuration;
/**
* @var Currently connected host
*/
protected $host;
/**
* @param Parameters $config
*/
public function __construct(Parameters $config)
{
$this->configuration = $config;
}
/**
* connection using the injected config
*/
public function connect()
{
$host = $this->configuration->get('host');
// connection to host, authentication etc...
//if connected
$this->host = $host;
}
/*
* 獲取當(dāng)前連接的主機(jī)
*
* @return string
*/
public function getHost()
{
return $this->host;
}
}
4、測試代碼
Tests/DependencyInjectionTest.php
namespace DesignPatterns\Structural\DependencyInjection\Tests;
use DesignPatterns\Structural\DependencyInjection\ArrayConfig;
use DesignPatterns\Structural\DependencyInjection\Connection;
class DependencyInjectionTest extends \PHPUnit_Framework_TestCase
{
protected $config;
protected $source;
public function setUp()
{
$this->source = include 'config.php';
$this->config = new ArrayConfig($this->source);
}
public function testDependencyInjection()
{
$connection = new Connection($this->config);
$connection->connect();
$this->assertEquals($this->source['host'], $connection->getHost());
}
}
Tests/config.php
return array('host' => 'github.com');
5、總結(jié)
依賴注入模式需要在調(diào)用者外部完成容器創(chuàng)建以及容器中接口與實(shí)現(xiàn)類的運(yùn)行時(shí)綁定工作,在 Laravel 中該容器就是服務(wù)容器,而接口與實(shí)現(xiàn)類的運(yùn)行時(shí)綁定則在服務(wù)提供者中完成。此外,除了在調(diào)用者的構(gòu)造函數(shù)中進(jìn)行依賴注入外,還可以通過在調(diào)用者的方法中進(jìn)行依賴注入。
總結(jié)
以上是生活随笔為你收集整理的php 依赖注入框架,依赖注入模式(Dependency Injection)的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 实现Modbus TCP多网段客户端应用
- 下一篇: USB应用开发笔记之一:STM32上实现