Laravel 依赖注入原理
众所周知 Laravel 的文档对于依赖注入只写了如何使用,相信大多数人对于他的实现原理并不太清楚。虽然使用过程中并不需要关心她的原理,但是了解原理让你使用起来更自信。这个帖子就通过一个小 demo 来简述实现原理,demo 如下,该 demo 可直接运行:
<?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程序。具体使用可查看手册。
本帖已被设为精华帖!
手动点赞
一个小小的问题:对array_splice这一句有困惑。
简单注释一下备忘
依赖注入怎么能少得了更进一步的容器呢(/摊手)