关键技术
-
ReflectionClass
反射类 - 递归
功能实现
一个简单的自动对象创建容器(暂不考虑相互依赖的类创建)
代码实现
public function create($abstract)
{
$refClass = new ReflectionClass($abstract);
if ($refClass->hasMethod('__construct')) {
$methodParams = $refClass->getMethod('__construct')->getParameters();
foreach ($methodParams as $param) {
$_constructParams[] = $this->create($param->getClass()->getName());
}
}
return $refClass->newInstance(... ($_constructParams ?? []));
}
实现思路
- 类创建过程需要调用到构造函数
__construct
,因此创建过程需要动态获取到__construct
的参数列表,列一下可行的方案-
ReflectionClass
反射类获取 -
file_get_contents
或者readfile
读取文件内容匹配construct
参数部分 - 自定义数组存储参数(即自己管理创建参数 - 可通过脚本生成)
-
- 从上面看,显然使用
ReflectionClass
反射类获取__construct
是最方便的,也是目前几乎所有PHP容器实现的选择 - 然后考虑到
__construct
类中的其它类还有下一级的依赖参数列表,依赖层级是未知,故需要使用递归去遍历所有依赖(这里暂不考虑相互依赖的问题,后面会解决)
注
- 这仅仅是一个简单的对象创建容器,显然这样一个容器功能是很有限的,而且不能处理大部分问题。
- 本示例仅仅展示了容器的自动注入功能是如何通过代码实现的,对象的自动依赖注入创建并没有想象的复杂。
示例
- 你可以通过运行 src\Example1\test_example_1.php 测试文件看到容器成功创建了对象
A
并自动创建并注入了对象B
- 当然,在尝试创建对象
D
和E
时,代码抛出了致命错误,因为容器并不能解析基本数据类型以及mixed
类型的变量,这个问题将在下一节解决
网友评论