php laravel實現依賴注入原理(反射機制)
阿新 • • 發佈:2018-12-26
在使用laravel的時候,可以看到大量地使用了依賴注入。比如控制器中的HttpRequest物件,各種Model的實現類等等。這種實現方式的好處在於不需要再方法中頻繁地new某些例項,實現模組的解耦。
依賴注入使用PHP反射API實現
反射機制被多種語言使用,用來獲取類、例項物件、方法等語言構件資訊,通過反射API函式可以動態進行操作。以下編寫了簡單的例子來說明。我們需要呼叫App::run方法,看看怎麼來實現:
<?php class App { public function run(View $view) { echo $view->display(); } } class View { private $content; public function __construct(string $content) { $this->content = $content; } public function display() : string { return $this->content; } } //$app = new App(); //$app->run(new View("hello!")); $app = new App(); $reflectorApp = new ReflectionClass($app); //獲取App::run方法的ReflectionMethod物件 $reflectionMethod = $reflectorApp->getMethod("run"); $params = $reflectionMethod->getParameters(); //params是ReflectionParameter物件的陣列 $instanceList = []; foreach ($params as $param) { $reflector = $param->getClass(); //依賴注入的引數應該由容器來管理,這裡僅僅用於展示,就直接new了 if ($reflector->getName() == 'View') { $instanceList[] = new View('hello!'); } } call_user_func_array([$app, "run"], $instanceList);
更多反射API,可參考: