详解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面向对象全攻略 (十五) 多态的应用
Sep 30 PHP
PHP 获取客户端真实IP地址多种方法小结
May 15 PHP
用PHP写的基于Memcache的Queue实现代码
Nov 27 PHP
php将gd生成的图片缓存到memcache的小例子
Jun 05 PHP
php下载excel无法打开的解决方法
Dec 24 PHP
php模拟用户自动在qq空间发表文章的方法
Jan 07 PHP
PHP实现递归复制整个文件夹的类实例
Aug 03 PHP
php 类中的常量、静态属性、非静态属性的区别
Apr 09 PHP
PHP中cookie知识点学习
May 06 PHP
laravel实现一个上传图片的接口,并建立软链接,访问图片的方法
Oct 12 PHP
Laravel 框架控制器 Controller原理与用法实例分析
Apr 14 PHP
如何使用php生成zip压缩包
Apr 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
Terran剧情介绍
2020/03/14 星际争霸
PHPlet在Windows下的安装
2006/10/09 PHP
967 个函式
2006/10/09 PHP
php面向对象中的魔术方法中文说明
2014/03/04 PHP
php+jQuery.uploadify实现文件上传教程
2014/12/26 PHP
php显示时间常用方法小结
2015/06/05 PHP
PHP大文件分割上传 PHP分片上传
2017/08/28 PHP
Thinkphp 框架配置操作之配置加载与读取配置实例分析
2020/05/15 PHP
Javascript hasOwnProperty 方法 &amp; in 关键字
2008/11/26 Javascript
JavaScript与Div对层定位和移动获得坐标的实现代码
2010/09/08 Javascript
jQuery extend 的简单实例
2013/09/18 Javascript
jquery在项目中做复选框时遇到的一些问题笔记
2013/11/17 Javascript
chrome下img加载对height()的影响示例探讨
2014/05/26 Javascript
深入浅析JavaScript中数据共享和数据传递
2016/04/25 Javascript
在JavaScript中模拟类(class)及类的继承关系
2016/05/20 Javascript
解决Vue.js由于延时显示了{{message}}引用界面的问题
2018/08/25 Javascript
从Vuex中取出数组赋值给新的数组,新数组push时报错的解决方法
2018/09/18 Javascript
Jquery实现无缝向上循环滚动列表的特效
2019/02/13 jQuery
这15个Vue指令,让你的项目开发爽到爆
2019/10/11 Javascript
基于jQuery拖拽事件的封装
2020/11/29 jQuery
python遍历序列enumerate函数浅析
2017/10/17 Python
对Python的zip函数妙用,旋转矩阵详解
2018/12/13 Python
Centos部署django服务nginx+uwsgi的方法
2019/01/02 Python
Python基础之条件控制操作示例【if语句】
2019/03/23 Python
pyinstaller参数介绍以及总结详解
2019/07/12 Python
python json load json 数据后出现乱序的解决方案
2020/02/27 Python
canvas粒子动画背景的实现示例
2018/09/03 HTML / CSS
使用canvas一步步实现图片打码功能的方法
2019/06/17 HTML / CSS
Mytheresa美国官网:德国知名的女性奢侈品电商
2017/05/27 全球购物
巴黎一票通:The Paris Pass
2018/02/10 全球购物
计算s=f(f(-1.4))的值
2014/05/06 面试题
医药营销个人求职信范文
2014/02/07 职场文书
餐厅销售主管职责范本
2014/02/19 职场文书
无犯罪记录证明范本
2014/09/15 职场文书
个人先进事迹材料范文
2014/12/29 职场文书
研究生个人学年总结
2015/02/14 职场文书