详解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在XP下IIS和Apache2服务器上的安装
Sep 05 PHP
php笔记之常用文件操作
Oct 12 PHP
关于PHP的相似度计算函数:levenshtein的使用介绍
Apr 15 PHP
php实现文件下载实例分享
Jun 02 PHP
PHP中的类型约束介绍
May 11 PHP
php实现微信公众平台账号自定义菜单类
Oct 11 PHP
最新制作ThinkPHP3.2.3完全开发手册
Nov 23 PHP
PHP获取二维数组中某一列的值集合
Dec 25 PHP
PHP实现文件上传与下载实例与总结
Mar 13 PHP
使用phpexcel类实现excel导入mysql数据库功能(实例代码)
May 12 PHP
php扩展开发入门demo示例
Sep 23 PHP
Yii框架布局文件的动态切换操作示例
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
PHP has encountered an Access Violation 错误的解决方法
2010/01/17 PHP
如何在PHP中使用正则表达式进行查找替换
2013/06/13 PHP
cakephp打印sql语句的方法
2015/02/13 PHP
初识laravel5
2015/03/02 PHP
php外部执行命令函数用法小结
2016/10/11 PHP
PHP预定义接口――Iterator用法示例
2020/06/05 PHP
用js实现的抽象CSS圆角效果!!
2007/05/03 Javascript
JavaScript学习笔记(二) js对象
2011/10/25 Javascript
jquery 笔记 事件
2011/11/02 Javascript
基于JQuery实现滚动到页面底端时自动加载更多信息
2014/01/31 Javascript
jquery动态加载js/css文件方法(自写小函数)
2014/10/11 Javascript
JavaScript字符串对象charAt方法入门实例(用于取得指定位置的字符)
2014/10/17 Javascript
JavaScript中的全局对象介绍
2015/01/01 Javascript
js动态获取子复选项并设计全选及提交的实现方法
2016/06/24 Javascript
JavaScript与ActionScript3两者的同性与差异性
2016/09/22 Javascript
Vue.js组件使用开发实例教程
2016/11/01 Javascript
微信小程序 PHP生成带参数二维码
2017/02/21 Javascript
详解Vue-cli3 项目在安卓低版本系统和IE上白屏问题解决
2019/04/14 Javascript
vue模块移动组件的实现示例
2020/05/20 Javascript
微信小程序拖拽排序列表的示例代码
2020/07/08 Javascript
jQuery实现异步上传一个或多个文件
2020/08/17 jQuery
python调用java的Webservice示例
2014/03/10 Python
Python实现曲线拟合操作示例【基于numpy,scipy,matplotlib库】
2018/07/12 Python
wxpython绘制圆角窗体
2019/11/18 Python
10个Python面试常问的问题(小结)
2019/11/20 Python
解决Python pip 自动更新升级失败的问题
2020/02/21 Python
利用pipenv和pyenv管理多个相互独立的Python虚拟开发环境
2020/11/01 Python
iPad和Surface Pro蓝牙键盘:Brydge
2018/11/10 全球购物
Michael Kors加拿大官网:购买设计师手袋、手表、鞋子、服装等
2019/03/16 全球购物
Timberland俄罗斯官方网上商店:全球领先的户外品牌
2020/03/15 全球购物
中学教师师德师风演讲稿
2014/08/22 职场文书
销售简历自我评价怎么写
2014/09/26 职场文书
钢琴师观后感
2015/06/12 职场文书
酒桌上的祝酒词
2015/08/12 职场文书
初中物理教学反思
2016/02/19 职场文书
DBCA命令行搭建Oracle ADG的流程
2021/06/11 Oracle