就拿我們業務中常用的通知模塊來說。
?php * 定義了一個消息類 * Class Message html' target='_blank'>class Message{ public function seed() return seed email * 訂單產生的時候 需要發送消息class Order{ protected $messager = function __construct() $this- messager = new Message(); public function seed_msg() return $this- messager- seed();$Order = new Order();$Order- seed_msg();
上面的代碼是我們傳統的寫法。首先由個消息發送的類。然后在我們需要發送消息的地方,調用發送消息的接口。有一天你需要添加一個發送短信的接口以滿足不同的需求。那么你會發現你要再Message類里面做修改。同樣也要再Order類里面做修改。這樣就顯得很麻煩。這個時候就有了依賴注入的思路。下面把代碼做一個調整
?php * 為了約束我們先定義一個消息接口 * Interface Messageinterface Message{ public function seed(); * 有一個發送郵件的類 * Class SeedEmailclass SeedEmail implements Message public function seed() return seed email // TODO: Implement seed() method. *新增一個發送短信的類 * Class SeedSMSclass SeedSMS implements Message public function seed() return seed sms // TODO: Implement seed() method.
$Order = new Order($message);$Order- seed_msg();
這樣我們就實現了依賴注入的思路,是不是很方便擴展了。
服務容器我理解的服務容器就是一個自動產生類的工廠。?php * 為了約束我們先定義一個消息接口 * Interface Messageinterface Message{ public function seed(); * 有一個發送郵件的類 * Class SeedEmailclass SeedEmail implements Message public function seed() return seed email // TODO: Implement seed() method. *新增一個發送短信的類 * Class SeedSMSclass SeedSMS implements Message public function seed() return seed sms // TODO: Implement seed() method.
$SMS = $message- make( SMS $SMS- seed();
container是一個簡單的服務容器里面有bind,make兩個方法
bind是向容器中綁定服務對象。make則是從容器中取出對象。
在bind方法中需要傳入一個 concrete 我們可以傳入一個實例對象或者是一個閉包函數。
可以看到我這全使用的是閉包函數,其實也可以這樣寫
$sms = new SeedSMS();$message- bind( SMS ,$sms);
后面這種寫法與閉包相比的區別就是我們需要先實例化對象才能往容易中綁定服務。而閉包則是我們使用這個服務的時候才去實例化對象??梢钥闯鲩]包是有很多的優勢的。
makemake方法就從容器中出去方法。里面首先判斷了instances變量中是否有當前以及存在的服務對象,如果有直接返回。如果沒有那么會通過 call_user_func_array返回一個對象。call_user_func_array的使用可以查看
PHP 中 call_user_func 的使用
以上就是本文的全部內容,希望對大家的學習有所幫助,更多相關內容請關注PHP !
相關推薦:
PHP容器Pimple運行流程的分析
gitbash PHP執行輸出中文亂編解決方式
PHP中常用的數組函數
以上就是PHP中的服務容器與依賴注入的解析的詳細內容,PHP教程
鄭重聲明:本文版權歸原作者所有,轉載文章僅為傳播更多信息之目的,如作者信息標記有誤,請第一時間聯系我們修改或刪除,多謝。
新聞熱點
疑難解答