(一)从零编写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 ?? []));
}

实现思路

  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类型的变量,这个问题将在下一节解决
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 反射机制简介 在面向对象编程中,对象被系统赋予了自省的能力,而实现这个自省的过程就是反射。 ​反射,简单理解就是根...
    woodylan阅读 2,276评论 0 0
  • 2.1 我们的理念是:让别人为你服务 IoC是随着近年来轻量级容器(Lightweight Container)的...
    好好学习Sun阅读 2,733评论 0 11
  • 容器,字面上理解就是装东西的东西。常见的变量、对象属性等都可以算是容器。一个容器能够装什么,全部取决于你对该容器的...
    拉风的老衲阅读 431评论 1 3
  • Laravel 服务容器 发现一篇讲服务容器的文章,讲的很好,转载过来laravel 服务容器 实质是工厂模式的升...
    程大哥T_T阅读 690评论 1 3
  • 今日清明。窗外雨声淅沥,雷声隐隐,晨光携着雨光在窗外树影上闪烁,我还在床上伸着懒腰,一付慵懒不堪的样子,将整个早晨...
    庐山樵阅读 201评论 0 2