详解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 网络开发详解之远程文件包含漏洞
Apr 25 PHP
php简单对象与数组的转换函数代码(php多层数组和对象的转换)
May 18 PHP
php数组函数序列之array_search()- 按元素值返回键名
Nov 04 PHP
php生成略缩图代码
Jul 16 PHP
解析如何修改phpmyadmin中的默认登陆超时时间
Jun 25 PHP
php后门URL的防范
Nov 12 PHP
PHP统计目录大小的自定义函数分享
Nov 18 PHP
php将图片文件转换成二进制输出的方法
Jun 10 PHP
织梦sitemap地图实时推送给百度的教程
Aug 03 PHP
PHP给前端返回一个JSON对象的实例讲解
May 31 PHP
Laravel 框架返回状态拦截代码
Oct 18 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
MySQL相关说明
2007/01/15 PHP
浏览器预览PHP文件时顶部出现空白影响布局分析原因及解决办法
2013/01/11 PHP
php采用curl模仿登录人人网发布动态的方法
2014/11/07 PHP
我整理的PHP 7.0主要新特性
2016/01/07 PHP
PHP多进程编程总结(推荐)
2016/07/18 PHP
PHP封装的XML简单操作类完整实例
2017/11/13 PHP
Laravel 登录后清空COOKIE的操作方法
2019/10/14 PHP
8个超棒的学习 jQuery 的网站 推荐收藏
2011/04/02 Javascript
js将json格式内容转换成对象的方法
2013/11/01 Javascript
浅谈 jQuery 事件源码定位问题
2014/06/18 Javascript
纯JavaScript代码实现文本比较工具
2016/02/17 Javascript
jQuery插件datatables使用教程
2016/04/21 Javascript
微信小程序 wxapp视图容器 view详解
2016/10/31 Javascript
Mac下安装vue
2018/04/11 Javascript
vue-cli配置环境变量的方法
2018/07/09 Javascript
Javascript之高级数组API的使用实例
2019/03/08 Javascript
vue element-ui之怎么封装一个自己的组件的详解
2019/05/20 Javascript
JS实现transform实现扇子效果
2020/01/17 Javascript
python生成器表达式和列表解析
2016/03/10 Python
Ubuntu下使用python读取doc和docx文档的内容方法
2018/05/08 Python
Python2包含中文报错的解决方法
2018/07/09 Python
python跳过第一行快速读取文件内容的实例
2018/07/12 Python
详解小白之KMP算法及python实现
2019/04/04 Python
Python实现的ftp服务器功能详解【附源码下载】
2019/06/26 Python
pandas如何处理缺失值
2019/07/31 Python
Python操作SQLite数据库过程解析
2019/09/02 Python
详解Python 中sys.stdin.readline()的用法
2019/09/12 Python
python GUI库图形界面开发之PyQt5控件QTableWidget详细使用方法与属性
2020/02/25 Python
Java里面StringBuilder和StringBuffer有什么区别
2016/06/06 面试题
诉讼代理人授权委托书
2014/04/08 职场文书
酒店员工培训方案
2014/06/02 职场文书
授权委托书协议书
2014/10/16 职场文书
加强作风建设心得体会
2014/10/22 职场文书
银行客户经理培训心得体会
2016/01/09 职场文书
Redis主从配置和底层实现原理解析(实战记录)
2021/06/30 Redis
redis中lua脚本使用教程
2021/11/01 Redis