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


Posted in PHP onMay 25, 2021

目的

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

用法

DatabaseConfiguration 被注入 DatabaseConnection 并获取所需的 $config 。如果没有依赖注入模式, 配置将直接创建 DatabaseConnection 。这对测试和扩展来说很不好。

例子

Doctrine2 ORM 使用依赖注入。 例如,注入到 Connection 对象的配置。 对于测试而言, 可以轻松的创建可扩展的模拟数据并注入到 Connection 对象中。

Symfony 和 Zend Framework 2 已经有了依赖注入的容器。他们通过配置的数组来创建对象,并在需要的地方注入 (在控制器中)。

UML 图

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

代码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 相关文章推荐
如何使用动态共享对象的模式来安装PHP
Oct 09 PHP
php cookie的操作实现代码(登录)
Dec 29 PHP
用php代码限制国内IP访问我们网站
Sep 26 PHP
yii2中添加验证码的实现方法
Jan 09 PHP
PHP获取不了React Native Fecth参数的解决办法
Aug 26 PHP
微信公众平台开发-微信服务器IP接口实例(含源码)
Mar 05 PHP
PHP输出多个元素的排列或组合的方法
Mar 14 PHP
thinkphp 抓取网站的内容并且保存到本地的实例详解
Aug 25 PHP
php-fpm服务启动脚本的方法
Apr 27 PHP
使用tp框架和SQL语句查询数据表中的某字段包含某值
Oct 18 PHP
tp5.1 实现setInc字段自动加1
Oct 18 PHP
浅谈如何提高PHP代码质量之端到端集成测试
May 28 PHP
阿里云服务器搭建Php+Apache运行环境的详细过程
php+laravel 扫码二维码签到功能
你真的了解PHP中的引用符号(&)吗
php中配置文件保存修改操作 如config.php文件的读取修改等操作
May 12 #PHP
php7中停止php-fpm服务的方法详解
May 09 #PHP
解析laravel使用workerman用户交互、服务器交互
Apr 28 #PHP
PHP实现创建以太坊钱包转账等功能
Apr 21 #PHP
You might like
肝肠寸断了解下!盘点史上最伤心的十大动漫
2020/03/04 日漫
最新的php 文件上传模型,支持多文件上传
2009/08/13 PHP
PHP中SESSION使用中的一点经验总结
2012/03/30 PHP
PHP中is_dir()函数使用指南
2015/05/08 PHP
PHP设计模式之工厂方法设计模式实例分析
2018/04/25 PHP
PHP获取本周所有日期或者最近七天所有日期的方法
2018/06/20 PHP
js中cookie的使用详细分析
2008/05/28 Javascript
使用新的消息弹出框blackbirdjs
2008/10/16 Javascript
jQuery学习2 选择器的使用说明
2010/02/07 Javascript
javascript中字符串的定义示例代码
2013/12/19 Javascript
浅谈javascript 归并方法
2015/01/21 Javascript
JavaScript数组方法总结分析
2016/05/06 Javascript
微信小程序 参数传递详解
2016/10/24 Javascript
扩展jquery easyui tree的搜索树节点方法(推荐)
2016/10/28 Javascript
Node.js 回调函数实例详解
2017/07/06 Javascript
详细分析单线程JS执行问题
2017/11/22 Javascript
使用vue实现多规格选择实例(SKU)
2019/08/23 Javascript
一步一步实现Vue的响应式(对象观测)
2019/09/02 Javascript
vue + elementUI实现省市县三级联动的方法示例
2019/10/29 Javascript
JS代码触发事件代码实例
2020/01/02 Javascript
JS Thunk 函数的含义和用法实例总结
2020/04/08 Javascript
JS严格模式原理与用法实例分析
2020/04/27 Javascript
微信小程序自定义胶囊样式
2020/12/27 Javascript
Python 3.x 新特性及10大变化
2015/06/12 Python
Python正则表达式匹配日期与时间的方法
2019/07/07 Python
大学生自我鉴定书
2014/03/24 职场文书
一岗双责责任书
2014/04/15 职场文书
机械工程学院大学生求职信
2014/05/25 职场文书
护理目标管理责任书
2014/07/25 职场文书
2014年教师批评与自我批评思想汇报
2014/09/20 职场文书
2014年办公室人员工作总结
2014/12/09 职场文书
期中考试复习计划
2015/01/19 职场文书
初中生思想道德自我评价
2015/03/09 职场文书
在人间读书笔记
2015/06/30 职场文书
2016年九九重阳节活动总结
2016/04/01 职场文书
python实现简单反弹球游戏
2021/04/12 Python