DIY 实现 ThinkPHP 核心框架 (十四)利用反射实现依赖注入

依赖注入由容器自动完成,有了反射机制之后,可以实现自主依赖注入。修改Rrequest 类的构造方法如下

namespace think;

class Request
{
    public function __construct(App $app, $name)
    {
        var_dump($app instanceof App, $name);
    }
}

同时修改 bindParams() 方法,用 getClass() 方法获取参数类型提示,用 getName() 方法获取创建实例的类名。

protected function bindParams(ReflectionFunctionAbstract $reflect, array $vars = []): array
    {
        // 如果类没有配置参数,就直接返回空数组
        if ($reflect->getNumberOfParameters() == 0) {
            return [];
        }
        $args   = [];
        // 获取参数信息
        $params = $reflect->getParameters();

        foreach ($params as $param) {
            $name = $param->getName();
            $class = $param->getClass();
            if (isset($vars[$name])) {
                $args[] = $vars[$name];
                // 如果没有传参,就采用默认参数
            } elseif ($param->isDefaultValueAvailable()) {
                $args[] = $param->getDefaultValue();
            // 如果获取到参数类型,进一步实现实例化
            } elseif ($class) {
                $args[] = $this->make($class->getName());
            }
        }

访问 diy.tp,成功打印出

bool(true) string(4) "five"

表明成功利用反射实现依赖注入,之后删除 Request 类的构造函数,以便以后的演示。

本作品采用《CC 协议》,转载必须注明作者和本文链接
讨论数量: 0
(= ̄ω ̄=)··· 暂无内容!

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