当前位置:首页 > PHP教程 > php应用 > 列表

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

发布:smiling 来源: PHP粉丝网  添加日期:2022-04-27 10:54:37 浏览: 评论:0 

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

目的

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

用法

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

例子

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

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

UML 图

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

代码DatabaseConfiguration.php

  1. <?php 
  2.  
  3. namespace DesignPatterns\Structural\DependencyInjection; 
  4.  
  5. class DatabaseConfiguration 
  6.     /** 
  7.      * @var string 
  8.      */ 
  9.     private $host
  10.  
  11.     /** 
  12.      * @var int 
  13.      */ 
  14.     private $port
  15.  
  16.     /** 
  17.      * @var string 
  18.      */ 
  19.     private $username
  20.  
  21.     /** 
  22.      * @var string 
  23.      */ 
  24.     private $password
  25.  
  26.     public function __construct(string $host, int $port, string $username, string $password
  27.     { 
  28.         $this->host = $host
  29.         $this->port = $port
  30.         $this->username = $username
  31.         $this->password = $password
  32.     } 
  33.  
  34.     public function getHost(): string 
  35.     { 
  36.         return $this->host; 
  37.     } 
  38.  
  39.     public function getPort(): int 
  40.     { 
  41.         return $this->port; 
  42.     } 
  43.  
  44.     public function getUsername(): string 
  45.     { 
  46.         return $this->username; 
  47.     } 
  48.  
  49.     public function getPassword(): string 
  50.     { 
  51.         return $this->password; 
  52.     } 
  53. ?> 

DatabaseConnection.php

  1. <?php 
  2.  
  3. namespace DesignPatterns\Structural\DependencyInjection; 
  4.  
  5. class DatabaseConnection 
  6.     /** 
  7.      * @var DatabaseConfiguration 
  8.      */ 
  9.     private $configuration
  10.  
  11.     /** 
  12.      * @param DatabaseConfiguration $config 
  13.      */ 
  14.     public function __construct(DatabaseConfiguration $config
  15.     { 
  16.         $this->configuration = $config
  17.     } 
  18.  
  19.     public function getDsn(): string 
  20.     { 
  21.         // 这仅仅是演示,而不是一个真正的  DSN 
  22.         // 注意,这里只使用了注入的配置。 所以, 
  23.         // 这里是关键的分离关注点。 
  24.  
  25.         return sprintf( 
  26.             '%s:%s@%s:%d'
  27.             $this->configuration->getUsername(), 
  28.             $this->configuration->getPassword(), 
  29.             $this->configuration->getHost(), 
  30.             $this->configuration->getPort() 
  31.         ); 
  32.     } 
  33. ?> 

测试Tests/DependencyInjectionTest.php

  1. <?php 
  2.  
  3. namespace DesignPatterns\Structural\DependencyInjection\Tests; 
  4.  
  5. use DesignPatterns\Structural\DependencyInjection\DatabaseConfiguration; 
  6. use DesignPatterns\Structural\DependencyInjection\DatabaseConnection; 
  7. use PHPUnit\Framework\TestCase; 
  8.  
  9. class DependencyInjectionTest extends TestCase 
  10.     public function testDependencyInjection() 
  11.     { 
  12.         $config = new DatabaseConfiguration('localhost', 3306, 'domnikl''1234'); 
  13.         $connection = new DatabaseConnection($config); 
  14.  
  15.         $this->assertEquals('domnikl:1234@localhost:3306'$connection->getDsn()); 
  16.     } 
  17. ?>

Tags: PHP设计模式 PHP依赖注入

分享到: