laravel中如何利用反射實現依賴注入

依賴注入

在一個類中常常會依賴於其餘的對象,先看一下經典的寫法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進階架構師>>>實戰視頻、大廠面試文檔免費獲取

相關文章
相關標籤/搜索