容器注入

在使用依赖注入容器(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 所能

  • 分享常见实例
  • 提供工厂来解析类型签名
  • 解析接口签名

如果我们定义有关如何管理特定类型的规则,我们可以很好地控制从工厂共享,实例化或创建哪些类型。