PHP:依賴注入,控制反轉,依賴倒置原則
阿新 • • 發佈:2019-01-09
判斷程式碼的好壞,我們有自己的標準:高內聚,低耦合。為了解決這一問題,php中有許多優秀的設計模式,比如工廠模式,單例模式。
而在程式碼中體現出來的設計模式,就如依賴注入和控制反轉。
那什麼是依賴注入?
簡單來說,就是把A類所依賴的B類C類等以屬性或者建構函式等方式注入A類而不是直接在A類中例項化。
一般寫程式碼我們這樣寫
class EmailSendByQq { public function send(){ } } class User(){ public function register(){ $email = new EmailSendByQq(); $email->send();} }
呼叫User類的register註冊方法,例項化Email類傳送郵件。可以看到User類依賴EmailSendByQq類,沒有它User類就傳送不了郵件,但是如果我們不想用QQ郵箱轉而用163(EmailSendBy163)呢,就需要在一個個類中修改EmailSendByQq的例項化,如果使用控制反轉對這兩個類進行解耦,應該會好一點
class User { private $_emailSendObject; public function __construct($emailSendObject) { $this->_emailSendObject = $emailSendObject上面通過建構函式和屬性的方法傳遞物件的過程,就是依賴注入的體現。; } public function register(){ $this->_emailSendObject->send(); } } $emailSendObject = new EmailSendByQq; $user = new User($emailSendObject); $user->register(); //以屬性的方式同樣也可以實現 class EmailSendBy163 { public function send(){ } } class User{ public $emailSendObject; public functionregister(){ $this->emailSendObject->send(); } } $user = new User; $user->emailSendObject = new EmailSendBy163(); $user->register();
“注入”就是把一個例項傳到另一個例項內部。 接下來繼續把上面的程式碼優化,簡單工廠模式的體現。
//通過EmailSendByQq和EmailSendBy163類,我們提煉出一個interface介面,讓User類register方法依賴於interface介面的物件看起來更合適 interface EmailSender{ public function send(); } class EmailSendByQq implements EmailSender{ public function send(){ } } class EmailSendBy163 implements EmailSender{ public function send() { // TODO: Implement send() method. } } class User{ public $emailSenderClass; public function __construct(EmailSender $emailSenderObject) { $this->emailSenderClass = $emailSenderObject; } public function register(){ $this->emailSenderClass->send(); } } $user = new User(new EmailSendBy163); $user->register();
這樣便實現瞭解耦。
依賴倒置原則(Dependence Inversion Principle, DIP),是一種軟體設計思想。傳統軟體設計中,上層程式碼依賴於下層程式碼,當下層出現變動時, 上層程式碼也要相應變化,維護成本較高。而DIP的核心思想是上層定義介面,下層實現這個介面, 從而使得下層依賴於上層,降低耦合度,提高整個系統的彈性。這是一種經實踐證明的有效策略。