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

來源:互聯網
上載者:User
這篇文章介紹的內容是關於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的核心思想是上層定義介面,下層實現這個介面, 從而使得下層依賴於上層,降低耦合度,提高整個系統的彈性。這是一種經實踐證明的有效原則。

相關推薦:

php注入點構造代碼執行個體詳解

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.