详解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 相关文章推荐
Zend studio for eclipse中使php可以调用mysql相关函数的设置方法
Oct 13 PHP
PHP编码规范之注释和文件结构说明
Jul 09 PHP
全新的PDO数据库操作类php版(仅适用Mysql)
Jul 22 PHP
无需重新编译php加入ftp扩展的解决方法
Feb 07 PHP
解析isset与is_null的区别
Aug 09 PHP
PHP数组操作――获取数组最后一个值的方法
Apr 14 PHP
详细解读PHP的Yii框架中登陆功能的实现
Aug 21 PHP
PHP的运行机制与原理(底层)
Nov 16 PHP
PHP常用的三种设计模式
Feb 17 PHP
PHP生成各种随机验证码的方法总结【附demo源码】
Jun 05 PHP
Laravel中10个有用的用法小结
May 06 PHP
laravel orm 关联条件查询代码
Oct 21 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 header函数使用教程
2013/09/05 PHP
thinkphp的c方法使用示例
2014/02/24 PHP
php使用正则表达式获取字符串中的URL
2016/12/29 PHP
Mac下php 5升级到php 7的步骤详解
2017/04/26 PHP
PHP基于递归算法解决兔子生兔子问题
2018/05/11 PHP
ExtJS 2.0实用简明教程 之ExtJS版的Hello
2009/04/29 Javascript
JSON传递bool类型数据的处理方式介绍
2013/09/18 Javascript
jquery鼠标停止移动事件
2013/12/21 Javascript
在JS中解析HTML字符串示例代码
2014/04/16 Javascript
JS中的forEach、$.each、map方法推荐
2016/04/05 Javascript
JS HTML5实现拖拽移动列表效果
2020/08/27 Javascript
15款最好的Bootstrap在线编辑器
2016/08/03 Javascript
jQuery异步提交表单的两种方式
2016/09/13 Javascript
利用VUE框架,实现列表分页功能示例代码
2017/01/12 Javascript
详解微信小程序入门五: wxml文件引用、模版、生命周期
2017/01/20 Javascript
js判断PC端与移动端跳转
2020/12/24 Javascript
JavaScript实现反转字符串的方法详解
2017/04/27 Javascript
微信小程序 wx.request方法的异步封装实例详解
2017/05/18 Javascript
iscroll动态加载数据完美解决方法
2017/07/18 Javascript
认识less和webstrom的less配置方法
2017/08/02 Javascript
基于jQuery解决ios10以上版本缩放问题
2017/11/03 jQuery
jQuery鼠标滑过横向时间轴样式(代码详解)
2019/11/01 jQuery
angular8.5集成TinyMce5的使用和详细配置(推荐)
2020/11/16 Javascript
为python设置socket代理的方法
2015/01/14 Python
Python代码打开本地.mp4格式文件的方法
2019/01/03 Python
Python一键安装全部依赖包的方法
2019/08/12 Python
Python3搭建http服务器的实现代码
2020/02/11 Python
浅析python 定时拆分备份 nginx 日志的方法
2020/04/27 Python
微软香港官网及网上商店:Microsoft HK
2016/09/01 全球购物
Aerosoles爱柔仕官网:美国舒软女鞋品牌
2017/07/17 全球购物
小学生打架检讨书
2014/01/26 职场文书
党员弘扬焦裕禄精神思想汇报
2014/09/10 职场文书
2015年教师节活动总结
2015/03/20 职场文书
2015中学学校工作总结
2015/07/20 职场文书
《大禹治水》教学反思
2016/02/22 职场文书
阿里云Nginx配置https实现域名访问项目(图文教程)
2021/03/31 Servers