PHP 容器注射

示例

在使用依赖注入容器(DIC)的情况下,依赖注入(DI)可以看作是构造函数注入的超集。DIC通常会分析类构造函数的类型提示并解决其需求,从而有效地注入实例执行所需的依赖项。

确切的实现远远超出了本文档的范围,但在本质上,DIC依赖于使用类的签名...

namespace Documentation;

class Example
{
    private $meaning;

    public function __construct(Meaning $meaning)
    {
        $this->meaning = $meaning;
    }
}

...以自动实例化它,大部分时间都依赖于自动加载系统。

// 旧的PHP版本
$container->make('Documentation\Example');

// 从PHP 5.5开始
$container->make(\Documentation\Example::class);

如果您使用的PHP版本至少为5.5,并且希望以上面显示的方式获取类的名称,则第二种方法是正确的方法。这样,您可以使用现代IDE快速找到该类的用法,这将极大地帮助您进行潜在的重构。您不想依赖常规字符串。

在这种情况下,Documentation\Example知道它需要一个Meaning,而DIC会依次实例化一个Meaning类型。具体的实现不必依赖于使用实例。

相反,我们在创建对象之前在容器中设置规则,该规则指示如何在需要时实例化特定类型。

作为DIC,它具有许多优点

  • 共享常见实例

  • 提供工厂来解决类型签名

  • 解决接口签名

如果我们定义了有关如何管理特定类型的规则,则可以对工厂中共享,实例化或创建的类型进行精细控制。