依赖解析器
<?php
require 'lib.php';
class App
{
// 创建自动解析函数
function build($class){
$reflect = new ReflectionClass($class);
if(!$reflect->isInstantiable()){
throw new Exception('cannot be instantiated');
}
$constructor = $reflect->getConstructor();
if(is_null($constructor)){
return new $class;
}
// 获取实例化时候的各个参数
$parameters = $constructor->getParameters();
$dependencies = $this->getDependencies($parameters);
return $reflect->newInstanceArgs($dependencies);
}
//
public function getDependencies($params){
$dependencies = [];
foreach($params as $param){
$dependency = $param->getClass();
if(is_null($dependency)){
// 处理非class类型的函数
$dependencies[] = $this->resolveNonClass($param);
}else{
// 处理class类型的函数
$dependencies[] = $this->build($dependency->name);
}
}
return $dependencies;
}
// 解析没有参数的
public function resolveNonClass($param){
if($param->isDefaultValueAvailable()){
return $param->getDefaultValue();
}
throw new Exception('no default value, no idea what to do');
}
}
$class = 'lib\A';
$object = (new App)->build($class);
print_r($object);
用于测试依赖解析的类,文件名./lib.php
<?php
namespace lib;
class A{
protected $b;
protected $c;
public function __construct(B $b, C $c){
$this->b = $b;
$this->c = $c;
}
}
class B{
protected $c;
public function __construct(C $c){
$this->c = $c;
}
}
class C{
}
执行依赖解析器后的输出结果是:
lib\A Object
(
[b:protected] => lib\B Object
(
[c:protected] => lib\C Object
(
)
)
[c:protected] => lib\C Object
(
)
)