欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

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

程序员文章站 2022-06-25 16:48:54
目的实现了松耦合的软件架构,可得到更好的测试,管理和扩展的代码用法databaseconfiguration 被注入 databaseconnection 并获取所需的 $config 。如果没有依赖...

目的

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

用法

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设计模式之依赖注入模式的资料请关注其它相关文章!