详解PHP设计模式之依赖注入模式

 更新时间:2021年05月25日 15:46:08   作者:phpyu  
依赖注入模式:依赖注入是控制反转的一种实现方式。要实现控制反转,通常的解决方案是将创建被调用者实例的工作交由 IoC 容器来完成,然后在调用者中注入被调用者(通过构造器 / 方法注入实现),这样我们就实现了调用者与被调用者的解耦,该过程被称为依赖注入。

目的

实现了松耦合的软件架构,可得到更好的测试,管理和扩展的代码

用法

DatabaseConfiguration 被注入 DatabaseConnection 并获取所需的 $config 。如果没有依赖注入模式, 配置将直接创建 DatabaseConnection 。这对测试和扩展来说很不好。

例子

Doctrine2 ORM 使用依赖注入。 例如,注入到 Connection 对象的配置。 对于测试而言, 可以轻松的创建可扩展的模拟数据并注入到 Connection 对象中。

Symfony 和 Zend Framework 2 已经有了依赖注入的容器。他们通过配置的数组来创建对象,并在需要的地方注入 (在控制器中)。

UML 图

代码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实现APP微信支付的实例讲解

    PHP实现APP微信支付的实例讲解

    下面小编就为大家分享一篇PHP实现APP微信支付的实例讲解,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2018-02-02
  • php使用数组填充下拉列表框的方法

    php使用数组填充下拉列表框的方法

    这篇文章主要介绍了php使用数组填充下拉列表框的方法,涉及php操作数组的技巧,具有一定参考借鉴价值,需要的朋友可以参考下
    2015-03-03
  • 纯php生成随机密码

    纯php生成随机密码

    这篇文章主要介绍了纯php生成12位随机密码,生成密码安全可靠,感兴趣的小伙伴们可以参考一下
    2015-10-10
  • PHP设计模式之原型模式定义与用法详解

    PHP设计模式之原型模式定义与用法详解

    这篇文章主要介绍了PHP设计模式之原型模式定义与用法,结合实例形式详细分析了php原型模式的概念、原理、用法及相关使用注意事项,需要的朋友可以参考下
    2018-04-04
  • php array_flip() 删除数组重复元素

    php array_flip() 删除数组重复元素

    在PHP中,用于删除数组中重复元素有一个可用的函数,那就是 array_unique(), 但是它并不是一个最高效的方法,使用array_flip() 函数将比array_uniqure()在速度上高出五倍左右。
    2009-01-01
  • 不重新编译PHP为php增加openssl模块的方法

    不重新编译PHP为php增加openssl模块的方法

    不重新编译PHP为php增加openssl模块的方法,需要的朋友可以参考下。
    2011-06-06
  • PHP 输出缓冲控制(Output Control)详解

    PHP 输出缓冲控制(Output Control)详解

    本文主要介绍PHP 输出缓冲控制,这里提供了详细的相关资料及简单示例代码,帮助大家学习参考,有兴趣的小伙伴可以参考下
    2016-08-08
  • PHP生成条形码大揭秘

    PHP生成条形码大揭秘

    前阵子在接触到一个商家优惠券的功能,需要用到条形码,于是将资料重新整理下,需要的朋友可以参考下
    2015-09-09
  • PHP函数常用用法小结

    PHP函数常用用法小结

    由于PHP是一种解释型语言,所以函数编写和调用很是方便。总结一下魔术函数、嵌套函数、匿名函数、函数调用方式和函数参数使用等。
    2010-02-02
  • php连接mysql数据库最简单的实现方法

    php连接mysql数据库最简单的实现方法

    在本篇文章里小编给大家分享的是关于php怎样连接mysql数据库的相关实例内容,有需要的朋友们参考下。
    2019-09-09

最新评论