建構函式注入

物件通常依賴於其他物件。應該將依賴項作為引數傳遞給建構函式,而不是在建構函式中建立依賴項。這確保了物件之間沒有緊密耦合,並且能夠改變對類例項化​​的依賴性。這有許多好處,包括通過使依賴項顯式化使程式碼更容易閱讀,以及使測試更簡單,因為可以更容易地切換和模擬依賴項。

在以下示例中,Component 將取決於 Logger 的例項,但它不會建立一個。它需要將一個作為引數傳遞給建構函式。

interface Logger {
    public function log(string $message);
}

class Component {
    private $logger;

    public function __construct(Logger $logger) {
        $this->logger = $logger;
    }
}

沒有依賴注入,程式碼可能看起來類似於:

class Component {
    private $logger;

    public function __construct() {
        $this->logger = new FooLogger();
    }
}

使用 new 在建構函式中建立新物件表示未使用依賴注入(或未使用不完整),並且程式碼緊密耦合。這也表明程式碼未經過嚴格測試,或者可能有嚴格的測試,對程式狀態做出錯誤的假設。

在上面的示例中,我們使用依賴注入,如果需要,我們可以輕鬆地更改為不同的 Logger。例如,我們可能使用記錄到不同位置的 Logger 實現,或使用不同日誌記錄格式的 Logger 實現,或者記錄到資料庫而不是檔案的 Logger 實現。