PHP:依賴注入,控制反轉,依賴倒置原則

判斷代碼的好壞,我們有自己的標準:高內聚,低耦合。爲了解決這一問題,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 function register(){
        $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的核心思想是上層定義接口,下層實現這個接口, 從而使得下層依賴於上層,降低耦合度,提高整個系統的彈性。這是一種經實踐證明的有效策略。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章