码迷,mamicode.com
首页 > 其他好文 > 详细

Laravel 之 反射

时间:2021-06-04 19:22:08      阅读:0      评论:0      收藏:0      [点我收藏+]

标签:exce   laravel   实例化   param   自己的   根据   throw   程序   get   

PHP 反射是程序实现依赖注入的基础,也是Laravel服务容器实现服务解析的基础

反射函数参考:

  • ReflectionClass 报告了一个类的有关信息
  • ReflectionClass::getConstructor — 获取类的构造函数
  • ReflectionClass::getConstructor::getParameters — 获取到Constructor的属性值
  • ReflectionClass::newInstanceArgs — 从给出的参数创建一个新的类实例。
  • ReflectionParameter::getClass — 获得类型提示类。
  • ReflectionParameter::isDefaultValueAvailable — 检查是否有默认值。
  • ReflectionParameter::getDefaultValue — 获取到默认的属性值
<?php

class MyReflection
{
    public function make(string $className): object
    {
        try{
            //反射传递的类
            $reflectionClass = new ReflectionClass($className);
            //获取到反射类的construct方法
            $constructor = $reflectionClass->getConstructor();
            //定义一个默认的依赖属性
            $dependent = [];

            //判断这个类是否存在construct函数
            if (!is_null($constructor)){
                //获取到construct的属性
                $parameters = $constructor->getParameters();
                //获取到属性对应的类的属性...(递归)
                $dependent = $this->handle($parameters);
            }

            //根据获取到属性,实例化这个类
            return $reflectionClass->newInstanceArgs($dependent);
        }catch (\Exception $exception){
            throw new \Exception($className. ‘未定义‘);
        }
    }
    
    public function handle(array $parameters): array
    {
        //定义一个默认的依赖属性数组
        $dependent = [];

        //获取到construct的参数,循环遍历
        foreach ($parameters as $parameter){
            //判断属性是否是类
            if ($parameter->getClass()){
                //递归遍历,获取到依赖属性
                $dependent[] = $this->make($parameter->getClass()->name);
            } else {
                //判断是否存在默认值
                if ($parameter->isDefaultValueAvailable()){
                    //存在默认值的,将值添加到依赖数组中
                    $dependent[] = $parameter->getDefaultValue();
                } else {
                   	//可以根据类型判断,添加自己的参数
                    $dependent[] = ‘‘;
                }
            }
        }

        return $dependent;
    }
}

Laravel 之 反射

标签:exce   laravel   实例化   param   自己的   根据   throw   程序   get   

原文地址:https://www.cnblogs.com/ywjcqq/p/14848848.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!