详解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
截获网站title标签之家内容的例子
Oct 09 PHP
php和js交互一例-PHP教程,PHP应用
Jan 03 PHP
30 个很棒的PHP开源CMS内容管理系统小结
Oct 14 PHP
分割GBK中文遭遇乱码的解决方法
Aug 09 PHP
PHP弹出提示框并跳转到新页面即重定向到新页面
Jan 24 PHP
php绘图中显示不出图片的原因及解决
Mar 05 PHP
PHP+Memcache实现wordpress访问总数统计(非插件)
Jul 04 PHP
php中单个数据库字段多列显示(单字段分页、横向输出)
Jul 28 PHP
8个PHP程序员常用的功能汇总
Dec 18 PHP
详谈PHP程序Laravel 5框架的优化技巧
Jul 18 PHP
PHP实现的方程求解示例分析
Nov 11 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
Laravel中使用FormRequest进行表单验证方法及问题汇总
2016/06/19 PHP
thinkphp框架page类与bootstrap分页(美化)
2017/06/25 PHP
详解PHP的抽象类和抽象方法以及接口总结
2019/03/15 PHP
js实现在页面上弹出蒙板技巧简单实用
2013/04/16 Javascript
JavaScript中合并数组的N种方法
2014/09/16 Javascript
jQuery 1.9.1源码分析系列(十五)之动画处理
2015/12/03 Javascript
解析浏览器端的AJAX缓存机制
2016/06/21 Javascript
javascript运算符——位运算符全面介绍
2016/07/14 Javascript
微信小程序wx:for和wx:for-item的用法详解
2018/04/01 Javascript
angularJs中跳转到指定的锚点实例($anchorScroll)
2018/08/31 Javascript
AngularJS实现的自定义过滤器简单示例
2019/02/02 Javascript
Vue 组件注册全解析
2020/12/17 Vue.js
[01:00:35]2018DOTA2亚洲邀请赛3月30日B组 EffcetVSMineski
2018/03/31 DOTA
python的绘图工具matplotlib使用实例
2014/07/03 Python
python实现在windows下操作word的方法
2015/04/28 Python
Python中str.join()简单用法示例
2018/03/20 Python
Sanic框架蓝图用法实例分析
2018/07/17 Python
Python基础之条件控制操作示例【if语句】
2019/03/23 Python
python实现一行输入多个值和一行输出多个值的例子
2019/07/16 Python
python 函数的缺省参数使用注意事项分析
2019/09/17 Python
Flask中endpoint的理解(小结)
2019/12/11 Python
Python3和PyCharm安装与环境配置【图文教程】
2020/02/14 Python
使用openCV去除文字中乱入的线条实例
2020/06/02 Python
Python数据相关系数矩阵和热力图轻松实现教程
2020/06/16 Python
Python局部变量与全局变量区别原理解析
2020/07/14 Python
Python更改pip镜像源的方法示例
2020/12/01 Python
中国领先的专业家电网购平台:国美在线
2016/12/25 全球购物
单位介绍信范文
2014/01/18 职场文书
求职简历中自我评价
2014/01/28 职场文书
读书活动总结
2014/04/28 职场文书
供应商食品安全承诺书
2015/04/29 职场文书
中秋联欢会主持词
2015/07/04 职场文书
环保建议书作文300字
2015/09/14 职场文书
《天使的翅膀》读后感3篇
2019/12/20 职场文书
使用pandas或numpy处理数据中的空值(np.isnan()/pd.isnull())
2021/05/14 Python
Redis Lua脚本实现ip限流示例
2022/07/15 Redis