依賴注入php
當A類須要依賴於B類,也就是說須要在A類中實例化B類的對象來使用時候,若是B類中的功能發生改變,也會致使A類中使用B類的地方也要跟着修改,致使A類與B類高耦合。這個時候解決方式是,A類應該去依賴B類的接口,把具體的類的實例化交給外部。閉包
就拿咱們業務中經常使用的通知模塊來講。函數
1this 2spa 3code 4對象 5接口 6ci 7string 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 |
|
上面的代碼是咱們傳統的寫法。首先由個消息發送的類。而後在咱們須要發送消息的地方,調用發送消息的接口。有一天你須要添加一個發送短信的接口以知足不一樣的需求。那麼你會發現你要再Message類裏面作修改。一樣也要再Order類裏面作修改。這樣就顯得很麻煩。這個時候就有了依賴注入的思路。下面把代碼作一個調整
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 |
|
這樣咱們就實現了依賴注入的思路,是否是很方便擴展了。
服務容器
我理解的服務容器就是一個自動產生類的工廠。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 |
|
container是一個簡單的服務容器裏面有bind,make兩個方法
bind是向容器中綁定服務對象。make則是從容器中取出對象。
bind
在bind方法中須要傳入一個 concrete 咱們能夠傳入一個實例對象或者是一個閉包函數。
能夠看到我這全使用的是閉包函數,其實也能夠這樣寫
1 2 |
|
後面這種寫法與閉包相比的區別就是咱們須要先實例化對象才能往容易中綁定服務。而閉包則是咱們使用這個服務的時候纔去實例化對象。能夠看出閉包是有不少的優點的。
make
make方法就從容器中出去方法。裏面首先判斷了instances變量中是否有當前以及存在的服務對象,若是有直接返回。若是沒有那麼會經過 call_user_func_array返回一個對象.