详解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 相关文章推荐
BBS(php &amp; mysql)完整版(六)
Oct 09 PHP
PHP SQLite类
May 07 PHP
PHP 简单数组排序实现代码
Aug 05 PHP
PHP中break及continue两个流程控制指令区别分析
Apr 18 PHP
phpmyadmin安装时提示:Warning: require_once(./libraries/common.inc.php)错误解决办法
Aug 18 PHP
超级实用的7个PHP代码片段分享
Jan 05 PHP
hadoop中一些常用的命令介绍
Jun 19 PHP
php获取网卡的MAC地址支持WIN/LINUX系统
Apr 30 PHP
解析WordPress中控制用户登陆和判断用户登陆的PHP函数
Mar 01 PHP
php+croppic.js实现剪切上传图片功能
Aug 14 PHP
TP5.0框架实现无限极回复功能的方法分析
May 04 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
PHP5 安装方法
2007/01/15 PHP
PHP安全性漫谈
2012/06/28 PHP
php的crc32函数使用时需要注意的问题(不然就是坑)
2015/04/21 PHP
ThinkPHP框架实现的邮箱激活功能示例
2018/06/15 PHP
优化JavaScript脚本的性能的几个注意事项
2006/12/22 Javascript
28个JS验证函数收集
2010/03/02 Javascript
精通Javascript系列之数据类型 字符串
2011/06/08 Javascript
Extjs中TabPane如何嵌套在其他网页中实现思路及代码
2013/01/27 Javascript
JS根据变量保存方法名并执行方法示例
2014/04/04 Javascript
Javascript基础教程之数据类型 (布尔型 Boolean)
2015/01/18 Javascript
jQuery滚动插件scrollable.js用法分析
2017/05/25 jQuery
jQuery实现广告条滚动效果
2017/08/22 jQuery
浅谈JavaScript作用域和闭包
2017/09/18 Javascript
JS内部事件机制之单线程原理
2018/07/02 Javascript
微信小程序iBeacon测距及稳定程序的实现解析
2019/07/31 Javascript
Vuex,iView UI面包屑导航使用扩展详解
2019/11/04 Javascript
在vue中动态添加class类进行显示隐藏实例
2019/11/09 Javascript
JS实现audio音频剪裁剪切复制播放与上传(步骤详解)
2020/07/28 Javascript
JavaScript实现简单动态表格
2020/12/02 Javascript
[15:09]DOTA2国际邀请赛采访专栏:Loda
2013/08/06 DOTA
[01:37]TI4西雅图DOTA2前线报道 VG拿下首胜教练357给出获胜秘诀
2014/07/10 DOTA
Python ORM框架SQLAlchemy学习笔记之映射类使用实例和Session会话介绍
2014/06/10 Python
python实现list元素按关键字相加减的方法示例
2017/06/09 Python
Python发送邮件测试报告操作实例详解
2018/12/08 Python
pyttsx3实现中文文字转语音的方法
2018/12/24 Python
Python中注释(多行注释和单行注释)的用法实例
2019/08/28 Python
pycharm无法安装第三方库的问题及解决方法以scrapy为例(图解)
2020/05/09 Python
keras 如何保存最佳的训练模型
2020/05/25 Python
施华洛世奇英国官网:SWAROVSKI英国
2017/03/13 全球购物
Geekbuying波兰:购买中国电子产品
2019/10/20 全球购物
Vilebrequin美国官方网上商店:法国豪华泳装品牌
2020/02/22 全球购物
27个经典Linux面试题及答案,你知道几个?
2013/01/10 面试题
优秀班干部事迹材料
2014/01/26 职场文书
决心书标准格式
2014/03/11 职场文书
MySQL的Query Cache图文详解
2021/07/01 MySQL
Java 深入探究讲解简单工厂模式
2022/04/07 Java/Android