十年網站開發(fā)經驗 + 多家企業(yè)客戶 + 靠譜的建站團隊
量身定制 + 運營維護+專業(yè)推廣+無憂售后,網站問題一站解決
PHP中的依賴注入和服務容器怎么實現?針對這個問題,這篇文章詳細介紹了相對應的分析和解答,希望可以幫助更多想解決這個問題的小伙伴找到更簡單易行的方法。
創(chuàng)新互聯作為成都網站建設公司,專注重慶網站建設公司、網站設計,有關企業(yè)網站設計方案、改版、費用等問題,行業(yè)涉及攪拌罐車等多個領域,已為上千家企業(yè)服務,得到了客戶的尊重與認可。
依賴注入
依賴注入其實本質上是指對類的依賴通過構造器完成自動注入,例如在控制器架構方法和操作方法中一旦對參數進行對象類型約束則會自動觸發(fā)依賴注入,由于訪問控制器的參數都來自于URL請求,普通變量就是通過參數綁定自動獲取,對象變量則是通過依賴注入生成。
就拿我們業(yè)務中常用的通知模塊來說。
messager = new Message(); } public function seed_msg() { return $this->messager->seed(); } } $Order = new Order(); $Order->seed_msg();
上面的代碼是我們傳統的寫法。首先由個消息發(fā)送的類。然后在我們需要發(fā)送消息的地方,調用發(fā)送消息的接口。有一天你需要添加一個發(fā)送短信的接口以滿足不同的需求。那么你會發(fā)現你要再Message類里面做修改。同樣也要再Order類里面做修改。這樣就顯得很麻煩。這個時候就有了依賴注入的思路。下面把代碼做一個調整
messager = $message; } public function seed_msg() { return $this->messager->seed(); } } //我們需要發(fā)送郵件的時候 $message = new SeedEmail(); //將郵件發(fā)送對象作為參數傳遞給Order $Order = new Order($message); $Order->seed_msg(); //我們需要發(fā)送短信的時候 $message = new SeedSMS(); $Order = new Order($message); $Order->seed_msg();
這樣我們就實現了依賴注入的思路,是不是很方便擴展了。
服務容器
Laravel 提供了一個功能強大的 IoC 容器。這個 IoC 容器在 Laravel 中被稱作服務容器,是整個 Laravel 框架最核心的部分,在它的調度下,框架各個組件可以很好的組合在一起工作。實際上,Laravel 的Application 類就是一個繼承自 Container 的容器類,它就是整個 Laravel 應用的服務容器。
在 Laravel 應用中,可以通過 App 門面來訪問服務容器,還可以通過輔助函數 app() 來訪問,如果是在服務提供者(可以理解為一個專門用于綁定接口與實現到服務容器的地方)中,則一般通過 $this->app 來訪問容器。
我理解的服務容器就是一個自動產生類的工廠。
binds[$abstract] = $concrete; } else { $this->instances[$abstract] = $concrete; } } public function make($abstract, $parameters = []) { if (isset($this->instances[$abstract])) { return $this->instances[$abstract]; } array_unshift($parameters, $this); return call_user_func_array($this->binds[$abstract], $parameters); } } //創(chuàng)建一個消息工廠 $message = new Container(); //將發(fā)送短信注冊綁定到工廠里面 $message->bind('SMS',function (){ return new SeedSMS(); }); //將發(fā)送郵件注冊綁定到工廠 $message->bind('EMAIL',function (){ return new SeedEmail(); }); //需要發(fā)送短信的時候 $SMS = $message->make('SMS'); $SMS->seed();
container是一個簡單的服務容器里面有bind,make兩個方法
bind是向容器中綁定服務對象。make則是從容器中取出對象。
bind
在bind方法中需要傳入一個 concrete 我們可以傳入一個實例對象或者是一個閉包函數。
可以看到我這全使用的是閉包函數,其實也可以這樣寫
$sms = new SeedSMS(); $message->bind('SMS',$sms);
后面這種寫法與閉包相比的區(qū)別就是我們需要先實例化對象才能往容易中綁定服務。而閉包則是我們使用這個服務的時候才去實例化對象。可以看出閉包是有很多的優(yōu)勢的。
make
make方法就從容器中出去方法。里面首先判斷了instances變量中是否有當前以及存在的服務對象,如果有直接返回。如果沒有那么會通過 call_user_func_array返回一個對象.
關于PHP中的依賴注入和服務容器怎么實現問題的解答就分享到這里了,希望以上內容可以對大家有一定的幫助,如果你還有很多疑惑沒有解開,可以關注創(chuàng)新互聯行業(yè)資訊頻道了解更多相關知識。