详解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 将excel导入mysql
Nov 09 PHP
codeigniter教程之多文件上传使用示例
Feb 11 PHP
Zend Framework实现Zend_View集成Smarty模板系统的方法
Mar 05 PHP
php运行报错Call to undefined function curl_init()的最新解决方法
Nov 20 PHP
ThinkPHP 整合Bootstrap Ajax分页样式
Dec 23 PHP
给大家分享几个常用的PHP函数
Jan 15 PHP
Yii2中hasOne、hasMany及多对多关联查询的用法详解
Feb 15 PHP
php实现基于pdo的事务处理方法示例
Jul 21 PHP
Yii2结合Workerman的websocket示例详解
Sep 10 PHP
php intval函数用法总结
Apr 14 PHP
深入学习微信网址链接解封的防封原理visit_type
Aug 15 PHP
Yii框架where查询用法实例分析
Oct 22 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
php入门学习知识点六 PHP文件的读写操作代码
2011/07/14 PHP
PHP中文字符串截断无乱码解决方法
2016/10/10 PHP
用javascript实现的支持lrc歌词的播放器
2007/05/17 Javascript
ExtJS扩展 垂直tabLayout实现代码
2009/06/21 Javascript
javascript实现的基于金山词霸网络翻译的代码
2010/01/15 Javascript
jQuery数据显示插件整合实现代码
2011/10/24 Javascript
js鼠标及对象坐标控制属性详细解析
2013/12/14 Javascript
JavaScript避免内存泄露及内存管理技巧
2014/09/05 Javascript
js实现Form栏显示全格式时间时钟效果代码
2015/08/19 Javascript
js实现类似MSN提示的页面效果代码分享
2015/08/24 Javascript
jQuery实现TAB风格的全国省份城市滑动切换效果代码
2015/08/24 Javascript
Ajax使用原生态JS验证用户名是否存在
2020/05/26 Javascript
ionic3+Angular4实现接口请求及本地json文件读取示例
2017/10/11 Javascript
vue-cli实现多页面多路由的示例代码
2018/01/30 Javascript
es6中reduce的基本使用方法
2019/09/10 Javascript
详解Vue的watch中的immediate与watch是什么意思
2019/12/30 Javascript
javascript设计模式 ? 享元模式原理与用法实例分析
2020/04/15 Javascript
详解JavaScript作用域、作用域链和闭包的用法
2020/09/03 Javascript
js实现复制粘贴的两种方法
2020/12/04 Javascript
vue3 watch和watchEffect的使用以及有哪些区别
2021/01/26 Vue.js
在Django中使用Sitemap的方法讲解
2015/07/22 Python
详解Python编程中time模块的使用
2015/11/20 Python
python人民币小写转大写辅助工具
2018/06/20 Python
Keras 数据增强ImageDataGenerator多输入多输出实例
2020/07/03 Python
浅析python 字典嵌套
2020/09/29 Python
python基于socket模拟实现ssh远程执行命令
2020/12/05 Python
html5+css3之CSS中的布局与Header的实现
2014/11/21 HTML / CSS
建筑班组长岗位职责
2014/01/02 职场文书
八年级历史教学反思
2014/01/10 职场文书
母亲节感恩寄语
2014/02/21 职场文书
《宋庆龄故居的樟树》教学反思
2014/04/07 职场文书
酒店管理毕业生自荐信
2014/05/25 职场文书
今冬明春火灾防控工作方案
2014/05/29 职场文书
工程部主管岗位职责
2015/02/12 职场文书
2016小学教师读书心得体会
2016/01/13 职场文书
PHP使用QR Code生成二维码实例
2021/07/07 PHP