资讯专栏INFORMATION COLUMN

PHP通过反射实现自动注入参数

seal_de / 1500人阅读

摘要:现在的框架中都有一个容器,而容器解决依赖的问题是通过反射来达到的,首先先说明一下项目文件结构核心,获得实例而我们要运行,而这个控制器的构造函数需要一个类,而类构造函数需要一个类。以上代码可以查看我的仓库

现在的框架中都有一个容器, 而容器解决依赖的问题是通过反射来达到的,

首先先说明一下项目文件结构:

/ ROOT_PATH

├─src
│ ├─Controllers
│ │  └─IndexController.php
| ├─Application.php (核心,获得实例)
│ ├─Http.php
│ └─Request.php
│
├─vendor
│ └─autoload.php
│
├─composer.json
└─index.php

而我们要运行IndexController.php,而这个控制器的构造函数需要一个Request类,而Request类构造函数需要一个Http类。


IndexController.php

className;
    }

}

Application.php

isInstantiable())
            {
                throw new Exception($class . " 类不可实例化");
            }

            // 查看是否用构造函数
            $rel_method = $rel_class->getConstructor();

            // 没有构造函数的话,就可以直接 new 本类型了
            if (is_null($rel_method))
            {
                return new $class();
            }

            // 有构造函数的话就获取构造函数的参数
            $dependencies = $rel_method->getParameters();

            // 处理,把传入的索引数组变成关联数组, 键为函数参数的名字
            foreach ($parameters as $key => $value)
            {
                if (is_numeric($key))
                {
                    // 删除索引数组, 只留下关联数组
                    unset($parameters[$key]);

                    // 用参数的名字做为键
                    $parameters[$dependencies[$key]->name] = $value;
                }
            }

            // 处理依赖关系
            $actual_parameters = [];

            foreach ($dependencies as $dependenci)
            {
                // 获取对象名字,如果不是对象返回 null
                $class_name = $dependenci->getClass();
                // 获取变量的名字
                $var_name = $dependenci->getName();

                // 如果是对象, 则递归new
                if (array_key_exists($var_name, $parameters))
                {
                    $actual_parameters[] = $parameters[$var_name];
                }
                elseif (is_null($class_name))
                {
                    // null 则不是对象,看有没有默认值, 如果没有就要抛出异常
                    if (! $dependenci->isDefaultValueAvailable())
                    {
                        throw new Exception($var_name . " 参数没有默认值");
                    }

                    $actual_parameters[] = $dependenci->getDefaultValue();
                }
                else
                {
                    $actual_parameters[] = self::make($class_name->getName());
                }

            }


            // 获得构造函数的数组之后就可以实例化了
            return $rel_class->newInstanceArgs($actual_parameters);
        }

    }

Http.php

className = __CLASS__;
    }
}

Request.php

className = __CLASS__;

        $this->className = $this->className . "  ->  " . $http->className;
    }
}

index.php



输出:

我是 WaitmoonmanReflexControllersIndexController 我依赖WaitmoonmanReflexRequest -> WaitmoonmanReflexHttp
F:phpStudyWWW
eflexindex.php:12:
object(WaitmoonmanReflexControllersIndexController)[9]

这就是一个完整的反射类动态注入参数的实例。
以上代码可以查看我的git仓库

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/25851.html

相关文章

  • 浅析如何通过PHP类的反射实现依赖注入

    摘要:也正式因为类的反射很多框架才能实现依赖注入自动解决类与类之间的依赖关系,这给我们平时的开发带来了很大的方便。为了更好地理解,我们通过一个例子来看类的反射,以及如何实现依赖注入。反射出方法的参数其返回值为对象构成的数组。 PHP具有完整的反射 API,提供了对类、接口、函数、方法和扩展进行逆向工程的能力。通过类的反射提供的能力我们能够知道类是如何被定义的,它有什么属性、什么方法、方法都有...

    WilsonLiu95 评论0 收藏0
  • 搞懂依赖注入, 用 PHP 手写简易 IOC 容器

    摘要:依赖注入控制反转的一种具体实现方法。接下来,我们使用依赖注入实现控制反转,使依赖关系倒置依赖被动传入。从单元测试的角度看,依赖注入更方便和操作,方便了测试人员写出质量更高的测试代码。 前言 好的设计会提高程序的可复用性和可维护性,也间接的提高了开发人员的生产力。今天,我们就来说一下在很多框架中都使用的依赖注入。 一些概念 要搞清楚什么是依赖注入如何依赖注入,首先我们要明确一些概念。 D...

    antz 评论0 收藏0
  • 反射PHP 中的应用

    摘要:反射在每个面向对象的编程语言中都存在,它的主要目的就是在运行时分析类或者对象的状态,导出或提取出关于类方法属性参数等的详细信息,包括注释。反射是操纵面向对象范型中元模型的,可用于构建复杂,可扩展的应用。 反射在每个面向对象的编程语言中都存在,它的主要目的就是在运行时分析类或者对象的状态,导出或提取出关于类、方法、属性、参数等的详细信息,包括注释。 反射是操纵面向对象范型中元模型的 AP...

    stormgens 评论0 收藏0
  • PHP反射机制

    摘要:反射机制反射机制从开始支持,做业务开发的话应该很少接触反射。我的理解就是反射机制能拿到类里面的属性方法,和的也可以以上是官方文档中给出的东西,说实话我看了感觉没什么感觉。在容器成员变量中数组维护这个类,反射实例调用构造函数,获取返回值。 PHP反射机制 PHP反射机制从PHP5开始支持,做业务开发的话应该很少接触反射。我其实也是接触不多,最近在学习laravel的优雅,就接触了到它其中...

    URLOS 评论0 收藏0
  • Laravel 服务容器实现原理

    摘要:框架中就是使用服务容器来实现控制反转和依赖注入。容器依赖注入的实现实现原理需要了解的知识点闭包匿名函数匿名函数,也叫闭包函数,允许临时创建一个没有指定名称的函数反射以上版本具有完整的反射,添加了对类接口函数方法和扩展进行反向工程的能力。 前言 通过实现laravel 框架功能,以便深入理解laravel框架的先进思想。 什么是服务容器 服务容器是用来管理类依赖与运行依赖注入的工具。La...

    wupengyu 评论0 收藏0

发表评论

0条评论

最新活动
阅读需要支付1元查看
<