想必打開這篇文章的人,對依賴注入和控制反轉都有了大體的概念。簡單的說:控制反轉是依賴注入的實現。php
男人A 要找女友,他能夠去網聊、去夜店、去酒吧等等各類地方碰運氣,花錢花時間。這是一種找女友的方法,也是不少人的作法。設計模式
男人B 要找女友,他年紀大了沒有那麼多時間和精力在這方面花費氣力,直接去相親。這是不少大齡青年找女友的方法,也就是今天想說的方法。框架
假設以上例子就是找女友,找到女友就OK。那麼哪個效率更高呢?顯然是男人B。函數
對於男人B 來講,他的目標是找女友,他 依賴 相親 注入 女友。這裏的相親能夠理解成爲一個服務,好比說婚戀網站,同事朋友的介紹,婚介所等等。網站
對於男人A 來講,他的所投入的時間和金錢等,能夠擁有更高質量的女友。可能對這個女友瞭如指掌,能徹底摸清楚她的脾氣,以致於可以控制她。設計
但對於男人B 來講,想了解和控制這個女友就很差說了。由於一點都不瞭解,更別說控制了。換句話說:控制 這個女友的能力,徹底 反轉 了。code
不少人不理解依賴注入和控制反轉主要是不熟悉適用場景,其實在不少框架中咱們說用到了 IoC 和 DI,實際上都是一回事,他實際上就是咱們設計模式的一種:門面模式,也稱外觀模式。get
實際上,在去理解 依賴注入 和 控制反轉 時,咱們須要有兩個概念。it
class Boy { public function getGirlfriend() { $site = new LoveSite(); $site->createGirl(); } } class LoveSite { public function createGirl() {} } $boy = new Boy; $boy->getGirlfriend();
以上代碼是個例子,對於 Boy 來講, LoveSite 是他的一個依賴,只有在使用 Boy,並調用 getGirlfriend 方法的時候,纔會被它注入,並建立一個 girl。io
而控制反轉在這個例子中的體現就是用單獨的一個 LoveSite 類去實現 createGirl 的功能,而不是把這個函數的代碼寫在 Boy 類中。
以上。。。