您好,登錄后才能下訂單哦!
laravel中怎么利用反射實現依賴注入,針對這個問題,這篇文章詳細介紹了相對應的分析和解答,希望可以幫助更多想解決這個問題的小伙伴找到更簡單易行的方法。
在一個類中經常會依賴于其他的對象,先看一下經典的寫法
class Foo { public $bar; public function __construct() { $this->bar = new Bar(); } } $foo = new Foo();
當類的依賴發生改變時,比如 Bar
這個類需要實例化參數時,而依賴于它的類有很多,總不能一個一個地去修改吧。
再看一下使用 依賴注入
怎么做
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
類需要參數了,外部修改就好了,不必一個個地去修改依賴于它的類。
在 laravel
中,經常寫出下面這種代碼
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
來反射類方法。
關于laravel中怎么利用反射實現依賴注入問題的解答就分享到這里了,希望以上內容可以對大家有一定的幫助,如果你還有很多疑惑沒有解開,可以關注億速云行業資訊頻道了解更多相關知識。
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。