依賴注入
在一個類中常常會依賴於其餘的對象,先看一下經典的寫法php
class Foo { public $bar; public function __construct() { $this->bar = new Bar(); } } $foo = new Foo();
當類的依賴發生改變時,好比 Bar
這個類須要實例化參數時,而依賴於它的類有不少,總不能一個一個地去修改吧。laravel
再看一下使用 依賴注入
怎麼作面試
class Foo { public $bar; public function __construct($bar) { $this->bar = $bar; } } $bar = new Bar(); //$bar = new Bar($args); $foo = $foo = new Foo($bar);
將 Bar
類在外部實例化好後,做爲一個參數傳入進 Foo
類,從而實現了 控制反轉
,假如如今 Bar
類須要參數了,外部修改就行了,沒必要一個個地去修改依賴於它的類。sql
laravel中的依賴注入
在 laravel
中,常常寫出下面這種代碼shell
class SomeController { public function index(Request $request) { dd($request->all()); } }
只要在方法參數中申明 Request $request
,就能夠直接使用 $request
對象了,很是地方便。服務器
其實laravel在背後利用PHP的反射機制爲咱們作了 $request = new Request
這一步。反射是一種類的檢討能力,能夠導出類的詳細信息包括屬性、方法、甚至註釋等等。關於反射能夠查看PHP文檔http://php.net/manual/zh/intro.reflection.php架構
實現,看代碼併發
$method = new ReflectionMethod('SomeController', 'index'); $args = []; foreach($method->getParameters() as $parameter) { if ($class = $parameter->getClass()) { $args[] = new $class->name; //$request = new Request } } $method->invokeArgs(new SomeController, $args);
經過 ReflectionMethod
獲取類方法的參數,若是參數是其餘的類,就實例化後做爲參數使用 ReflectionMethod::invokeArgs
傳入到類方法中,原理就是這麼簡單。分佈式
一般使用 new ReflectionClass('className')
來反射類,ReflectionMethod
來反射類方法。微服務
以上內容但願幫助到你們, 不少PHPer在進階的時候總會遇到一些問題和瓶頸,業務代碼寫多了沒有方向感,不知道該從那裏入手去提高,對此我整理了一些資料,包括但不限於:分佈式架構、高可擴展、高性能、高併發、服務器性能調優、TP6,laravel,Redis,Swoole、Swoft、Kafka、Mysql優化、shell腳本、Docker、微服務、Nginx等多個知識點高級進階乾貨須要的能夠免費分享給你們 ,須要戳這裏 PHP進階架構師>>>實戰視頻、大廠面試文檔免費獲取