反射
2020-01-30 本文已影响0人
LittleTrue
问题描述:
函数接收的一个参数存储了类名,想要动态的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中的指令信息