DIY 实现 ThinkPHP 核心框架 (十三)利用反射实现参数绑定

什么是反射?

它是指在 PHP 运行状态中,扩展分析 PHP 程序,导出或提取出关于类、方法、属性、参数等的详细信息,包括注释。这种动态获取的信息以及动态调用对象的方法的功能称为 反射 API 。主要用于框架或插件的开发。

修改 core/src/think/Container.php 中的 invokeClass() 方法。

    public function invokeClass (string $class, array $vars = [])
    {
        // 获取反射类
        $reflect = new ReflectionClass($class);
        // 获取构造方法
        $constructor = $reflect->getConstructor();
        // 利用 bindParams 绑定参数
        $args = $constructor ? $this->bindParams($constructor, $vars) : [];
        // 实例化
        return $reflect->newInstanceArgs($args);
    }

编写 bindParams() 方法,实现参数绑定

    protected function bindParams(ReflectionFunctionAbstract $reflect, array $vars = []): array
    {
        // 如果需要实例化的类没有参数设置,就直接返回空数组
        if ($reflect->getNumberOfParameters() == 0) {
            return [];
        }
        $args   = [];
        // 获取参数信息
        $params = $reflect->getParameters();
        foreach ($params as $param) {
            $name = $param->getName();
            if (isset($vars[$name])) {
                $args[] = $vars[$name];
                // 如果没有参数,就使用默认值
            } elseif ($param->isDefaultValueAvailable()) {
                $args[] = $param->getDefaultValue();
            }
        }
        return $args;
    }

Request 类中定义构造方法用于测试

public function __construct(string $addr, string $forum, string $lang)
    {
        echo '论坛网址是:' . $addr . '<br />';
        echo '论坛名称是:' . $forum . '<br />';
        echo '技术语言是:' . $lang . '<br />';
    }

Index 控制器编写 show() 方法,测试绑定参数的功能

public function show ()
    {
        \think\Container::get('request', ['addr' => 'https://learnku.com/php',  'forum' => 'PHP 技术论坛', 'lang' => 'PHP'], true);
    }

访问 diy.tp ,成功输出

论坛网址是:https://learnku.com/php
论坛名称是:PHP 技术论坛
技术语言是:PHP
本作品采用《CC 协议》,转载必须注明作者和本文链接
讨论数量: 0
(= ̄ω ̄=)··· 暂无内容!

讨论应以学习和精进为目的。请勿发布不友善或者负能量的内容,与人为善,比聪明更重要!