详解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 相关文章推荐
解析isset与is_null的区别
Aug 09 PHP
PHP生成图片验证码、点击切换实例
Jun 25 PHP
thinkphp学习笔记之多表查询
Jul 28 PHP
php数组查找函数总结
Nov 18 PHP
php中实现xml与mysql数据相互转换的方法
Dec 25 PHP
ecshop实现smtp发送邮件
Feb 03 PHP
php禁止某ip或ip地址段访问的方法
Feb 25 PHP
PHP使用strtotime计算两个给定日期之间天数的方法
Mar 18 PHP
PHP获取远程图片并保存到本地的方法
May 12 PHP
php判断访问IP的方法
Jun 19 PHP
php调用自己java程序的方法详解
May 13 PHP
php实现的数组转xml案例分析
Sep 28 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使之能同时支持GIF和JPEG
2006/10/09 PHP
php实现表单提交上传文件功能
2018/05/28 PHP
Laravel实现批量更新多条数据
2020/04/06 PHP
jquery的ajax从纯真网(cz88.net)获取IP地址对应地区名
2009/12/02 Javascript
JS无限极树形菜单,json格式、数组格式通用示例
2013/07/30 Javascript
Javascript基础 函数“重载” 详细介绍
2013/10/25 Javascript
Jquery获得控件值的三种方法总结
2014/02/13 Javascript
js判断页面中是否有指定控件的简单实例
2014/03/04 Javascript
在JavaScript中操作数组之map()方法的使用
2015/06/09 Javascript
js实现动态加载脚本的方法实例汇总
2015/11/02 Javascript
js实现网页收藏功能
2015/12/17 Javascript
js转html实体的方法
2016/09/27 Javascript
仿iframe效果Aajx文件上传实例
2016/11/18 Javascript
微信小程序之仿微信漂流瓶实例
2016/12/09 Javascript
ES6新特性五:Set与Map的数据结构实例分析
2017/04/21 Javascript
详解AngularJS 路由 resolve用法
2017/04/24 Javascript
详解开源的JavaScript插件化框架MinimaJS
2017/10/26 Javascript
vue 实现剪裁图片并上传服务器功能
2018/03/01 Javascript
详解使用element-ui table组件的筛选功能的一个小坑
2018/11/02 Javascript
七行JSON代码把你的网站变成移动应用过程详解
2019/07/09 Javascript
微信小程序tab切换可滑动切换导航栏跟随滚动实现代码
2019/09/04 Javascript
layui点击弹框页面 表单请求的方法
2019/09/21 Javascript
javascript读取本地文件和目录方法详解
2020/08/06 Javascript
jQuery实现放大镜案例
2020/10/19 jQuery
Python处理RSS、ATOM模块FEEDPARSER介绍
2015/02/18 Python
Python轻量级ORM框架Peewee访问sqlite数据库的方法详解
2017/07/20 Python
OpenCV+python手势识别框架和实例讲解
2018/08/03 Python
修改python plot折线图的坐标轴刻度方法
2018/12/13 Python
Python实现E-Mail收集插件实例教程
2019/02/06 Python
Python发送邮件的实例代码讲解
2019/10/16 Python
CSS3 倾斜的网页图片库实例教程
2009/11/14 HTML / CSS
JSF面试题:Jsf中的核心类用那些?有什么作用?LiftCycle六大生命周期是什么?
2014/07/17 面试题
自动化专业职业生涯规划书范文
2014/01/16 职场文书
小学老师寄语大全
2014/04/04 职场文书
2014年个人总结范文
2015/03/09 职场文书
小学信息技术教学反思
2016/02/16 职场文书