详解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 相关文章推荐
PHP5中使用DOM控制XML实现代码
May 07 PHP
php中比较简单的导入phpmyadmin生成的sql文件的方法
Jun 28 PHP
php addslashes 利用递归实现使用反斜线引用字符串
Aug 05 PHP
php calender(日历)二个版本代码示例(解决2038问题)
Dec 24 PHP
ThinkPHP 3.2 数据分页代码分享
Oct 14 PHP
php实现点击可刷新验证码
Nov 07 PHP
PHP随机数 C扩展随机数
May 04 PHP
利用 fsockopen() 函数开放端口扫描器的实例
Aug 19 PHP
PHP文件管理之实现网盘及压缩包的功能操作
Sep 20 PHP
浅谈PHP接入(第三方登录)QQ登录 OAuth2.0 过程中遇到的坑
Oct 13 PHP
PHP基于curl实现模拟微信浏览器打开微信链接的方法示例
Feb 15 PHP
PHP+Redis开发的书签案例实战详解
Jul 09 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
基于数据库的在线人数,日访问量等统计
2006/10/09 PHP
php自定义函数截取汉字长度
2014/05/15 PHP
php对文件夹进行相关操作(遍历、计算大小)
2015/11/04 PHP
PHP基于GD2函数库实现验证码功能示例
2019/01/27 PHP
学习js所必须要知道的一些
2007/03/07 Javascript
基于jQuery的公告无限循环滚动实现代码
2012/05/11 Javascript
JavaScript高级程序设计 阅读笔记(十八) js跨平台的事件
2012/08/14 Javascript
自己实现string的substring方法 人民币小写转大写,数字反转,正则优化
2012/09/02 Javascript
JS中获取数据库中的值的方法
2013/07/14 Javascript
jQuery实现列表自动循环滚动鼠标悬停时停止滚动
2013/09/06 Javascript
javascript:void(0)的作用示例介绍
2013/10/28 Javascript
如何判断元素是否为HTMLElement元素
2013/12/06 Javascript
jQuery实现自定义checkbox和radio样式
2015/07/13 Javascript
全面了解js中的script标签
2016/07/04 Javascript
vue.js绑定class和style样式(6)
2016/12/09 Javascript
[05:10]2014DOTA2国际邀请赛 通往胜利之匙赛场探秘之旅
2014/07/18 DOTA
[01:17]辉夜杯战队访谈宣传片—EHOME
2015/12/25 DOTA
在Python中处理字符串之isdecimal()方法的使用
2015/05/20 Python
python使用生成器实现可迭代对象
2018/03/20 Python
Python中的单行、多行、中文注释方法
2018/07/19 Python
python按比例随机切分数据的实现
2019/07/11 Python
详解python中的数据类型和控制流
2019/08/08 Python
python批量解压zip文件的方法
2019/08/20 Python
西班牙英格列斯百货法国官网:El Corte Inglés法国
2017/07/09 全球购物
伦敦香水公司:The London Perfume Company
2019/11/13 全球购物
学校先进集体事迹材料
2014/05/31 职场文书
政府四风问题整改措施
2014/10/04 职场文书
五年级小学生评语
2014/12/26 职场文书
财务经理岗位职责
2015/01/31 职场文书
求职意向书范本
2015/05/11 职场文书
狂人日记读书笔记
2015/06/30 职场文书
Ajax实现三级联动效果
2021/10/05 Javascript
OpenCV实现反阈值二值化
2021/11/17 Java/Android
四十九个javascript小知识实用技巧
2021/11/20 Javascript
Python使用BeautifulSoup4修改网页内容
2022/05/20 Python
如何用H5实现好玩的2048小游戏
2022/07/23 HTML / CSS