详解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版自动生成文章摘要
Jul 23 PHP
php 随机数的产生、页面跳转、件读写、文件重命名、switch语句
Aug 07 PHP
php文件打包 下载之使用PHP自带的ZipArchive压缩文件并下载打包好的文件
Jun 13 PHP
Window下PHP三种运行方式图文详解
Jun 11 PHP
php生成随机颜色方法汇总
Dec 03 PHP
php实现无限级分类
Dec 24 PHP
PHP快速生成各种信息提示框的方法
Feb 03 PHP
php微信开发之带参数二维码的使用
Aug 03 PHP
PHP未登录自动跳转到登录页面
Dec 21 PHP
Laravel 5.5 的自定义验证对象/类示例代码详解
Aug 29 PHP
PHP attributes()函数讲解
Feb 03 PHP
KindEditor在php环境下上传图片功能集成的方法示例
Jul 20 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通过cookies获取远程网页的指定代码
2013/06/25 PHP
yii2实现分页,带搜索的分页功能示例
2017/01/07 PHP
php实现的错误处理封装类实例
2017/06/20 PHP
基于swoole实现多人聊天室
2018/06/14 PHP
JavaScript方法和技巧大全
2006/12/27 Javascript
基于jQuery的倒计时插件代码
2011/05/07 Javascript
Jquery图片延迟加载插件jquery.lazyload.js的使用方法
2014/05/21 Javascript
JavaScript实现网页截图功能
2014/10/16 Javascript
基于JavaScript制作霓虹灯文字 代码 特效
2015/09/01 Javascript
javascript 判断两个日期之差的示例代码
2015/09/05 Javascript
JS实现同一个网页布局滑动门和TAB选项卡实例
2015/09/23 Javascript
基于Jquery实现焦点图淡出淡入效果
2015/11/30 Javascript
Javascript类型系统之undefined和null浅析
2016/07/13 Javascript
jquery attr()设置和获取属性值实例教程
2016/09/25 Javascript
node.js利用redis数据库缓存数据的方法
2017/03/01 Javascript
vue使用mint-ui实现下拉刷新和无限滚动的示例代码
2017/11/06 Javascript
微信小程序实现拍照画布指定区域生成图片
2019/07/18 Javascript
VUE实现移动端列表筛选功能
2019/08/23 Javascript
layui实现给某一列加点击事件
2019/10/26 Javascript
jQuery实现可编辑的表格
2019/12/11 jQuery
vue中的循环对象属性和属性值用法
2020/09/04 Javascript
[45:25]完美世界DOTA2联赛循环赛 PXG vs IO 第一场 11.06
2020/11/09 DOTA
Python编程之多态用法实例详解
2015/05/19 Python
python3.6 实现AES加密的示例(pyCryptodome)
2018/01/10 Python
Python cookbook(数据结构与算法)将名称映射到序列元素中的方法
2018/03/22 Python
python email smtplib模块发送邮件代码实例
2018/04/26 Python
Linux下通过python获取本机ip方法示例
2019/09/06 Python
Python中url标签使用知识点总结
2020/01/16 Python
JD Sports德国官网:英国领先的运动鞋和运动服饰零售商
2018/02/26 全球购物
营销专业应届生求职信
2013/11/26 职场文书
酒店司机岗位职责
2013/12/14 职场文书
会计电算化个人求职信范文
2014/01/24 职场文书
学籍证明模板
2014/11/21 职场文书
个人年终总结范文
2015/03/09 职场文书
2015年秋季灭鼠工作总结
2015/07/27 职场文书
详解thinkphp的Auth类认证
2021/05/28 PHP