美文网首页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容器-构建一个简单的自动对象创建容器

    项目源码 关键技术 ReflectionClass反射类 递归 功能实现 一个简单的自动对象创建容器(暂不考虑相互...

  • docker 简单部署

    使用 node 镜像部署 先创建一个简单的html 编写Dockerfile 构建镜像 运行容器 使用docker...

  • (零)从零编写PHP容器

    说明 个人github地址 项目源码 一、前置 杂谈 关于造轮子 关于编写项目 必要知识 IOC DI Refle...

  • Spring IOC 如何实现

    IOC有一个专门的容器,来创建这些对象,由IOC容器来控制对象的创建,依赖对象也是容器帮忙查找创建并进行注入,对象...

  • TintySpring构建过程 Step1-简单容器实现

    TintySpring构建过程 Step1-简单容器 最基本的容器最基本的容器我们需要的是一个能够容纳我们创建的B...

  • 组合模式

    组合模式可以通过简单的组件构建复杂的树状结构。组合对象是简单的容器对象,容器中的内容则可能是另一个组合对象。 然而...

  • docker之(三)自定义容器Dockerfile

    一、创建Dockerfile文件 二、构建容器 三、启动容器 四、查看容器日志

  • Docker NGINX + PHP

    Docker 多容器组合服务 拉取创建好的容器 启动 PHP 容器, 让 NGINX 把请求转发到 PHP-FPM...

  • dockerfile 部署LNMP

    1. 创建自定义网络 2. 创建 nginx 容器 3. 创建PHP容器 4. 创建 mysql 容器 5. 推送...

  • Spring Ioc DI

    Spring Ioc 容器是Spring框架的核心。只需要进行简单的容器配置,就能将创建对象,使用对象,销毁对象联...

网友评论

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

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