实现了松耦合的软件架构,可获得更好的测试,管理和扩展的代码php
依赖注入模式:依赖注入(Dependency Injection)是控制反转(Inversion of Control)的一种实现方式。要实现控制反转,一般的解决方案是将建立被调用者实例的工做交由 IoC 容器来完成,而后在调用者中注入被调用者(经过构造器 / 方法注入实现),这样咱们就实现了调用者与被调用者的解耦,该过程被称为依赖注入。laravel
DatabaseConfiguration 被注入 DatabaseConnection 并获取所需的 $config 。若是没有依赖注入模式, 配置将直接建立 DatabaseConnection 。这对测试和扩展来讲很很差。面试
Doctrine2 ORM 使用依赖注入。 例如,注入到 Connection 对象的配置。 对于测试而言, 能够轻松的建立可扩展的模拟数据并注入到 Connection 对象中。sql
Symfony 和 Zend Framework 2 已经有了依赖注入的容器。他们经过配置的数组来建立对象,并在须要的地方注入 (在控制器中)。shell
<?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; } }
<?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() ); } }
<?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 互联网架构师 50K 成长指南+行业问题解决总纲(持续更新)服务器
面试10家公司,收获9个offer,2020年PHP 面试问题架构
★若是喜欢个人文章,想与更多资深开发者一块儿交流学习的话,获取更多大厂面试相关技术咨询和指导,欢迎加入咱们的群啊,暗号:phpzh(君羊号码856460874)。并发
内容不错的话但愿你们支持鼓励下点个赞/喜欢,欢迎一块儿来交流;另外若是有什么问题 建议 想看的内容能够在评论提出