作者:是不是本人_310 | 来源:互联网 | 2023-09-14 14:38
(一)从零编写PHP容器-构建一个简单的自动对象创建容器个人博客地址项目源码关键技术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
类中的其它类还有下一级的依赖参数列表,依赖层级是未知,故需要使用递归去遍历所有依赖(这里暂不考虑相互依赖的问题,后面会解决)
注
- 这仅仅是一个简单的对象创建容器,显然这样一个容器功能是很有限的,而且不能处理大部分问题。
- 本示例仅仅展示了容器的自动注入功能是如何通过代码实现的,对象的自动依赖注入创建并没有想象的复杂。
示例
- 你可以通过运行 srcExample1 est_example_1.php 测试文件看到容器成功创建了对象
A
并自动创建并注入了对象B
- 当然,在尝试创建对象
D
和E
时,代码抛出了致命错误,因为容器并不能解析基本数据类型以及mixed
类型的变量,这个问题将在下一节解决