1. 程式人生 > >php laravel實現依賴注入原理(反射機制)

php laravel實現依賴注入原理(反射機制)

在使用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,可參考:

http://php.net/manual/zh/class.reflectionclass.php