目的
实现了松耦合的软件架构,可得到更好的测试,管理和扩展的代码
用法
databaseconfiguration 被注入 databaseconnection 并获取所需的 $config 。如果没有依赖注入模式, 配置将直接创建 databaseconnection 。这对测试和扩展来说很不好。
例子
doctrine2 orm 使用依赖注入。 例如,注入到 connection 对象的配置。 对于测试而言, 可以轻松的创建可扩展的模拟数据并注入到 connection 对象中。
symfony 和 zend framework 2 已经有了依赖注入的容器。他们通过配置的数组来创建对象,并在需要的地方注入 (在控制器中)。
uml 图

代码databaseconfiguration.php
<?php
namespace designpatterns\structural\dependencyinjection;
class databaseconfiguration
{
/**
* @var string
*/
private $host;
/**
* @var int
*/
private $port;
/**
* @var string
*/
private $username;
/**
* @var string
*/
private $password;
public function __construct(string $host, int $port, string $username, string $password)
{
$this->host = $host;
$this->port = $port;
$this->username = $username;
$this->password = $password;
}
public function gethost(): string
{
return $this->host;
}
public function getport(): int
{
return $this->port;
}
public function getusername(): string
{
return $this->username;
}
public function getpassword(): string
{
return $this->password;
}
}
?>
databaseconnection.php
<?php
namespace designpatterns\structural\dependencyinjection;
class databaseconnection
{
/**
* @var databaseconfiguration
*/
private $configuration;
/**
* @param databaseconfiguration $config
*/
public function __construct(databaseconfiguration $config)
{
$this->configuration = $config;
}
public function getdsn(): string
{
// 这仅仅是演示,而不是一个真正的 dsn
// 注意,这里只使用了注入的配置。 所以,
// 这里是关键的分离关注点。
return sprintf(
'%s:%s@%s:%d',
$this->configuration->getusername(),
$this->configuration->getpassword(),
$this->configuration->gethost(),
$this->configuration->getport()
);
}
}
?>
测试tests/dependencyinjectiontest.php
<?php
namespace designpatterns\structural\dependencyinjection\tests;
use designpatterns\structural\dependencyinjection\databaseconfiguration;
use designpatterns\structural\dependencyinjection\databaseconnection;
use phpunit\framework\testcase;
class dependencyinjectiontest extends testcase
{
public function testdependencyinjection()
{
$config = new databaseconfiguration('localhost', 3306, 'domnikl', '1234');
$connection = new databaseconnection($config);
$this->assertequals('domnikl:1234@localhost:3306', $connection->getdsn());
}
}
?>
以上就是详解php设计模式之依赖注入模式的详细内容,更多关于php设计模式之依赖注入模式的资料请关注其它相关文章!
隔壁老痒