美文网首页PHP
(一)从零编写PHP容器-构建一个简单的自动对象创建容器

(一)从零编写PHP容器-构建一个简单的自动对象创建容器

作者: FinalZero | 来源:发表于2020-02-19 15:55 被阅读0次

    项目源码

    关键技术

    • 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 ?? []));
    }
    

    实现思路

    1. 类创建过程需要调用到构造函数__construct,因此创建过程需要动态获取到__construct的参数列表,列一下可行的方案
      • ReflectionClass反射类获取
      • file_get_contents或者readfile读取文件内容匹配construct参数部分
      • 自定义数组存储参数(即自己管理创建参数 - 可通过脚本生成)
    2. 从上面看,显然使用ReflectionClass反射类获取__construct是最方便的,也是目前几乎所有PHP容器实现的选择
    3. 然后考虑到__construct类中的其它类还有下一级的依赖参数列表,依赖层级是未知,故需要使用递归去遍历所有依赖(这里暂不考虑相互依赖的问题,后面会解决)

    • 这仅仅是一个简单的对象创建容器,显然这样一个容器功能是很有限的,而且不能处理大部分问题。
    • 本示例仅仅展示了容器的自动注入功能是如何通过代码实现的,对象的自动依赖注入创建并没有想象的复杂。

    示例

    • 你可以通过运行 src\Example1\test_example_1.php 测试文件看到容器成功创建了对象A并自动创建并注入了对象B
    • 当然,在尝试创建对象DE时,代码抛出了致命错误,因为容器并不能解析基本数据类型以及mixed类型的变量,这个问题将在下一节解决

    相关文章

      网友评论

        本文标题:(一)从零编写PHP容器-构建一个简单的自动对象创建容器

        本文链接:https://www.haomeiwen.com/subject/psmafhtx.html