容器注入
在使用依赖注入容器(DIC)的上下文中的依赖注入(DI)可以被视为构造函数注入的超集。DIC 通常会分析类构造函数的类型提示并解决其需求,从而有效地注入实例执行所需的依赖项。
确切的实现远远超出了本文档的范围,但从本质上讲,DIC 依赖于使用类的签名…
namespace Documentation;
class Example
{
private $meaning;
public function __construct(Meaning $meaning)
{
$this->meaning = $meaning;
}
}
…自动实例化它,大部分时间都依赖于自动加载系统 。
// older PHP versions
$container->make('Documentation\Example');
// since PHP 5.5
$container->make(\Documentation\Example::class);
如果你在版本中使用 PHP 至少为 5.5 并希望以上面显示的方式获取类的名称,那么正确的方法是第二种方法。这样你就可以使用现代 IDE 快速找到该类的用法,这将极大地帮助你进行潜在的重构。你不想依赖常规字符串。
在这种情况下,Documentation\Example
知道它需要一个 Meaning
,而 DIC 将依次实例化 Meaning
类型。具体实现不需要依赖于消费实例。
相反,我们在创建对象之前在容器中设置规则,指示在需要时应如何实例化特定类型。
这具有许多优点,如 DIC 所能
- 分享常见实例
- 提供工厂来解析类型签名
- 解析接口签名
如果我们定义有关如何管理特定类型的规则,我们可以很好地控制从工厂共享,实例化或创建哪些类型。