衆所周知 Laravel 的文檔對於依賴注入只寫瞭如何使用,相信大多數人對於他的實現原理並不太清楚。雖然使用過程當中並不須要關心她的原理,可是瞭解原理讓你使用起來更自信。這個帖子就經過一個小 demo 來簡述實現原理,demo 以下,該 demo 可直接運行:php
<?php namespace Database; use ReflectionMethod; class Database { protected $adapter; public function __construct () {} public function test (MysqlAdapter $adapter) { $adapter->test(); } } class MysqlAdapter { public function test () { echo "i am MysqlAdapter test"; } } class app { public static function run ($instance, $method) { if (! method_exists($instance, $method)) return null; $reflector = new ReflectionMethod($instance, $method); $parameters = [ 1 ]; foreach ($reflector->getParameters() as $key => $parameter) { $class = $parameter->getClass(); if ($class) { array_splice($parameters, $key, 0, [ new $class->name() ]); } } call_user_func_array([ $instance, $method ], $parameters); } } app::run(new Database(), 'test');
原理主要運用了PHP反射api的 ReflectionMethod
類,在PHP運行狀態中,擴展分析PHP程序。具體使用可查看手冊。sql