详解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进行MySQL删除记录操作代码
Jun 07 PHP
php下通过伪造http头破解防盗链的代码
Jul 03 PHP
第4章 数据处理-php正则表达式-郑阿奇(续)
Jul 04 PHP
解析php中heredoc的使用方法
Jun 17 PHP
php setcookie(name, value, expires, path, domain, secure) 参数详解
Jun 28 PHP
利用php+mcDropdown实现文件路径可在下拉框选择
Aug 07 PHP
php获取图片信息的方法详解
Dec 10 PHP
[原创]php简单隔行变色功能实现代码
Jul 09 PHP
PHP数组操作简单案例分析
Oct 15 PHP
简单实现php上传文件功能
Sep 21 PHP
PHP设计模式之工厂模式(Factory Pattern)的讲解
Mar 21 PHP
PHP实现二维数组按照指定的字段进行排序算法示例
Apr 23 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
wiki-shan写的php在线加密的解密程序
2008/09/07 PHP
php 解决旧系统 查出所有数据分页的类
2012/08/27 PHP
PHP实现C#山寨ArrayList的方法
2015/07/16 PHP
php接口实现拖拽排序功能
2018/04/23 PHP
javascript对象的property和prototype是这样一种关系
2007/03/24 Javascript
一些经常会用到的Javascript检测函数
2010/05/31 Javascript
javascript正则表达式中参数g(全局)的作用
2010/11/11 Javascript
如何用JavaScript动态呼叫函数(两种方式)
2013/05/03 Javascript
jQuery.holdReady()方法用法实例
2014/12/27 Javascript
深入理解JavaScript系列(25):设计模式之单例模式详解
2015/03/03 Javascript
基于JavaScript如何实现ajax调用后台定义的方法
2015/12/29 Javascript
JavaScript实现跑马灯抽奖活动实例代码解析与优化(一)
2016/02/16 Javascript
Jquery ajax请求导出Excel表格的实现代码
2016/06/08 Javascript
bootstrap table 数据表格行内修改的实现代码
2017/02/13 Javascript
JS 组件系列之Bootstrap Table的冻结列功能彻底解决高度问题
2017/06/30 Javascript
Bootstrap模态对话框中显示动态内容的方法
2018/08/10 Javascript
vee-validate vue 2.0自定义表单验证的实例
2018/08/28 Javascript
vue 配置多页面应用的示例代码
2018/10/22 Javascript
详解Vue项目部署遇到的问题及解决方案
2019/01/11 Javascript
简单了解JavaScript异步
2019/05/23 Javascript
vue3.0自定义指令(drectives)知识点总结
2020/12/27 Vue.js
JS设计模式之责任链模式实例详解
2018/02/03 Python
python版DDOS攻击脚本
2019/06/12 Python
详解Python修复遥感影像条带的两种方式
2020/02/23 Python
python使用turtle库绘制奥运五环
2020/02/24 Python
python等待10秒执行下一命令的方法
2020/07/19 Python
Bootstrap File Input文件上传组件
2020/12/01 HTML / CSS
一套比较完整的软件测试人员面试题
2012/05/13 面试题
学历公证委托书
2014/04/09 职场文书
党员个人查摆剖析材料
2014/10/16 职场文书
党组织领导班子整改方案
2014/10/25 职场文书
关于践行三严三实的心得体会
2016/01/05 职场文书
2016年优秀共产党员先进事迹材料
2016/02/29 职场文书
公司致全体员工的感谢信
2019/06/24 职场文书
一文彻底理解js原生语法prototype,__proto__和constructor
2021/10/24 Javascript
zabbix配置nginx监控的实现
2022/05/25 Servers