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