详解PHP设计模式之依赖注入模式

admin3年前PHP教程23
目的

实现了松耦合的软件架构,可得到更好的测试,管理和扩展的代码

用法

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设计模式之依赖注入模式的资料请关注其它相关文章!

免责声明:本文内容来自用户上传并发布,站点仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。请核实广告和内容真实性,谨慎使用。

相关文章

PHP中=&gt;和-&gt;以及::符号的用法

没关系,下面我们做一下详细的解释,如果你有C++,Perl基础,你会发现这些家伙和他们里面的一些符号功能是差不多的。‘- >'符号插入式解引用操作符”(infix...

php中的标量数据类型总结

PHP 的数据类型可以分为三大类,分别是标量数据类型、复合数据类型和特殊数据类型。其中,标量数据类型是数据结构的最基础单元,只能存储一个数据。在 PHP 中的标量数据类型分为四种,如下表所示:类型 功...

济南高防服务器做游戏有哪些优势

使用济南高防服务器来做游戏有以下几个优势:高性能:游戏通常需要高性能的服务器来支持大量玩家同时在线,以及处理游戏数据的传输和计算。济南高防服务器通常具有高性能的CPU、内存和硬盘等硬件设备,可以提供稳...

PHP之深入学习Yii2缓存Cache组件详细讲解

什么是缓存组件cache缓存是提升 web 应用性能简便有效的方式。 通过将相对静态的数据存储到缓存并在收到请求时取回缓存, 应用程序便节省了每次重新生成这些数据所需的时间。定义缓存组件yii2的缓存...

PHP8新特性之JIT案例讲解

PHP8 alpha1已经在昨天发布,相信关于JIT是大家最关心的,它到底怎么用,有什么要注意的,以及性能提升到底咋样?首先,我们来看一张图:左图是 PHP 8之前的Opcache流程示意图, 右图是...

PHP反序列化字符串逃逸实例详解

通过CTF比赛了解PHP反序列化,记录自己的学习。借用哈大佬们的名言任何具有一定结构的数据,如果经过了某些处理而把结构体本身的结构给打乱了,则有可能会产生漏洞。0CTF 2016piapiapia--...