当前位置:首页 > 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.     /** 
  8.      * @var string 
  9.      */ 
  10.     private $host; 
  11.  
  12.     /** 
  13.      * @var int 
  14.      */ 
  15.     private $port; 
  16.  
  17.     /** 
  18.      * @var string 
  19.      */ 
  20.     private $username; 
  21.  
  22.     /** 
  23.      * @var string 
  24.      */ 
  25.     private $password; 
  26.  
  27.     public function __construct(string $host, int $port, string $username, string $password) 
  28.     { 
  29.         $this->host = $host; 
  30.         $this->port = $port; 
  31.         $this->username = $username; 
  32.         $this->password = $password; 
  33.     } 
  34.  
  35.     public function getHost(): string 
  36.     { 
  37.         return $this->host; 
  38.     } 
  39.  
  40.     public function getPort(): int 
  41.     { 
  42.         return $this->port; 
  43.     } 
  44.  
  45.     public function getUsername(): string 
  46.     { 
  47.         return $this->username; 
  48.     } 
  49.  
  50.     public function getPassword(): string 
  51.     { 
  52.         return $this->password; 
  53.     } 
  54. } 
  55. ?> 

DatabaseConnection.php

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

测试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. { 
  11.     public function testDependencyInjection() 
  12.     { 
  13.         $config = new DatabaseConfiguration('localhost', 3306, 'domnikl', '1234'); 
  14.         $connection = new DatabaseConnection($config); 
  15.  
  16.         $this->assertEquals('domnikl:1234@localhost:3306', $connection->getDsn()); 
  17.     } 
  18. } 
  19. ?>

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

分享到: