在使用依赖注入容器(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,它具有许多优点
共享常见实例
提供工厂来解决类型签名
解决接口签名
如果我们定义了有关如何管理特定类型的规则,则可以对工厂中共享,实例化或创建的类型进行精细控制。