容器注入

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

  • 分享常見例項
  • 提供工廠來解析型別簽名
  • 解析介面簽名

如果我們定義有關如何管理特定型別的規則,我們可以很好地控制從工廠共享,例項化或建立哪些型別。