容器注入
在使用依賴注入容器(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 所能
- 分享常見例項
- 提供工廠來解析型別簽名
- 解析介面簽名
如果我們定義有關如何管理特定型別的規則,我們可以很好地控制從工廠共享,例項化或建立哪些型別。