反射

作者: LittleTrue | 来源:发表于2020-01-30 00:07 被阅读0次
问题描述:

函数接收的一个参数存储了类名,想要动态的new出该类,并调用类中的方法

解决办法:使用php中的反射类

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

反射机制可以利用类名或者一个类的对象来获取关于这个类的一系列信息(类的变量,方法),然后又就可以利用得到的类的信息实例化一些类的对象。

正是因为类的反射,很多PHP框架才能实现依赖注入自动解决类与类之间的依赖关系,这给我们平时的开发带来了很大的方便。

/ 首先必须引入反射类
use ReflectionClass;
 
class Plan
{
    public function display(Request $request){
        $param = $request->param();
                //使用反射  建立 Ipmodel这个类的反射类
        $class = new ReflectionClass('app\index\controller\Ipmodel'); 
        $instance = $class->newInstance();  // 实例化
        $result = $instance->dataOut($param['plan_id']);   // 调用类中的方法dataOut
        $attr = $class->getConstant('CONFIG');           // 获取类中的属性CONFIG
 
        $resData['code'] = 200;
        $resData['data'] = $result;
        return $resData;
    }
}
//或者使用以下方法获取总列表
getMethods
getProperties
这里重点注意的是:

1:必须记得引入ReflectionClass

2:创建反射类时传送的类名,如果当前不在同一文件, 则必须包含完整的命名空间,即使使用了 use 关键字。否则找不到类名会抛出异常。

通过ReflectionClass,我们可以得到Person类的以下信息:
1)常量 Contants
2)属性 Property Names
3)方法 Method Names静态
4)属性 Static Properties
5)命名空间 Namespace
6) Person类是否为final或者abstract

反射API提供的常用类和函数:
 1:Reflection
   public static export(Reflector r [,bool return])//打印类或方法的详细信息
   public static  getModifierNames(int modifiers)  //取得修饰符的名字
 
 2:ReflectionMethod:
     public static string export()                       //打印该方法的信息
     public mixed invoke(stdclass object, mixed* args)   //调用对应的方法
     public mixed invokeArgs(stdclass object, array args)//调用对应的方法,传多参数
     public bool isFinal()        //方法是否为final
     public bool isAbstract()     //方法是否为abstract
     public bool isPublic()       //方法是否为public
     public bool isPrivate()      //方法是否为private
     public bool isProtected()    //方法是否为protected
     public bool isStatic()       //方法是否为static
     public bool isConstructor()  //方法是否为构造函数
 
 3:ReflectionClass:
     public static string export()  //打印类的详细信息
     public string getName()        //取得类名或接口名
     public bool isInternal()       //类是否为系统内部类
     public bool isUserDefined()    //类是否为用户自定义类
     public bool isInstantiable()   //类是否被实例化过
     public bool hasMethod(string name)  //类是否有特定的方法
     public bool hasProperty(string name)//类是否有特定的属性
     public string getFileName()         //获取定义该类的文件名,包括路径名
     public int getStartLine()           //获取定义该类的开始行
     public int getEndLine()             //获取定义该类的结束行
     public string getDocComment()       //获取该类的注释
     public ReflectionMethod getConstructor()           //取得该类的构造函数信息
     public ReflectionMethod getMethod(string name)     //取得该类的某个特定的方法信息
     public ReflectionMethod[] getMethods()             //取得该类的所有的方法信息
     public ReflectionProperty getProperty(string name) //取得某个特定的属性信息
     public ReflectionProperty[] getProperties()        //取得该类的所有属性信息
     public array getConstants()                        //取得该类所有常量信息
     public mixed getConstant(string name)              //取得该类特定常量信息
     public ReflectionClass[] getInterfaces()           //取得接口类信息
     public bool isInterface()  //测试该类是否为接口
     public bool isAbstract()   //测试该类是否为抽象类
 
 4:ReflectionParameter:
     public static string export()     //导出该参数的详细信息
     public string getName()           //取得参数名
     public bool isPassedByReference() //测试该参数是否通过引用传递参数
     public ReflectionClass getClass() //若该参数为对象,返回该对象的类名
     public bool isArray()             //测试该参数是否为数组类型
     public bool allowsNull()          //测试该参数是否允许为空
     public bool isOptional()          //测试该参数是否为可选的,当有默认参数时可选
     public bool isDefaultValueAvailable() //测试该参数是否为默认参数
     public mixed getDefaultValue()        //取得该参数的默认值
 
 5:ReflectionExtension类
     public static  export()    //导出该扩展的所有信息
     public string getName()    //取得该扩展的名字
     public string getVersion() //取得该扩展的版本
     public ReflectionFunction[] getFunctions()   //取得该扩展的所有函数
     public array getConstants()  //取得该扩展的所有常量
     public array getINIEntries() //取得与该扩展相关的,在php.ini中的指令信息

相关文章

  • Java基础之反射

    Java基础之反射 反射基本介绍 反射的使用通过反射调用属性和方法通过反射获取配置文件 反射基本介绍 Java反射...

  • 镜面反射矩阵的推导

    镜面反射是以镜面作为反射平面,实物与反射物到反射平面的距离相等,实物与反射物方向相反,所以,反射矩阵由反射平面确定...

  • reflect.go包学习_之二 指针操作提高反射性能 反射应用

    reflect.go包学习_之二 指针操作提高反射性能 反射应用 反射创建实例 反射信息、反射调用方法、反射修改值...

  • Java互联网公司-经典面试题附答案

    基础:Java 反射?反射有什么缺点?你是怎么理解反射的(为什么框架需要反射)?优点:反射具有解耦性,缺点:反射属...

  • Java反射与joor反射库的使用

    java原生反射的使用 反射构造对象 反射方法 反射字段 joor反射库的使用 github:https://gi...

  • Java反射

    什么是反射? 反射的作用? 反射性能优化?

  • 反射三定律

    反射第一定律:反射可以将interface类型变量转换成反射对象 反射第二定律:反射可以将反射对象还原成inter...

  • 反射

    1.反射是什么?反射的定义,概念 2.为什么要学反射? 3.怎么使用反射?反射的使用

  • 一周岁前做好两件事,孩子就不会语言迟缓,保证口齿伶俐

    与语言发展相关的原始反射有四个:张口反射、足跖反射、抓握反射和手拉反射,每个反射的发生、发展和整合都是次第进行的,...

  • 面试官问go反射第一弹

    目录 反射概念 reflect包 反射类型(Type)和种类(Kind) 反射类型(Type)使用 反射类型对象(...

网友评论

      本文标题:反射

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