【PHP高级特性】反射

PHP5具有完整的反射 API,实现了对类、接口、函数、方法和扩展进行反向工程的能力。

即通过反射Reflection相关类提供的方法,可以拥有取出函数、类和方法、文档注释等能力。

详细资料参考:http://php.net/manual/zh/book.reflection.php

 

反射API提供的常用类:

Reflection类可以打印类的基本信息,(通过提供的静态export()函数)

ReflectionMethod类打印类方法、得到方法的具体信息等

ReflectionClass类用于得到类信息,比如得到类包含的方法,类本的属性,是不是抽象类等

ReflectionParameter类显示参数的信息,可以动态得到已知方法的传参情况

ReflectionException类 用于显示错误信息

ReflectionExtension类得到PHP的扩展信息,可以判断扩展是否存在等

 

常用方法:

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

 

================================================================

 

代码示例:

1、ReflectionClass解析类

$ref =new \ReflectionClass('Student');
// 判断类是否可实例化
if($ref->isInstantiable()){
echo '可实例化';
}
 
// 获取类构造函数。有返回 ReflectionMethod 对象,没有返回 NULL
$constructor = $ref->getConstructor();
print_r($constructor);
 
// 获取某个属性
if($ref->hasProperty('id')){
$attr = $ref->getProperty('id');
print_r($attr);
}
 
// 获取属性列表
$attributes = $ref->getProperties();
foreach($attributes as $row){
// 这里的 $row 为 ReflectionProperty 的实例
echo $row->getName(),"\n";
}
 
// 获取静态属性,返回数组
$static = $ref->getStaticProperties();
print_r($static);
 
// 获取某个常量
if($ref->hasConstant('MAX_AGE')){
$const = $ref->getConstant('MAX_AGE');
echo $const;
}
 
// 获取常量,返回数组
$constants = $ref->getConstants();
print_r($constants);
 
// 获取某个方法
if($ref->hasMethod('bar')){
$method = $ref->getMethod('bar');
print_r($method);
}
 
// 获取方法列表
$methods = $ref->getMethods();
foreach($methods as $key => $value){
// 这里的 $row 为 ReflectionMethod 的实例
echo $value->getName()."\n";
}

2、ReflectionProperty类的属性的相关信息

if($ref->hasProperty('name')){
$attr = $ref->getProperty('name');
 
// 属性名称
echo $attr->getName();
 
// 类定义时属性为真,运行时添加的属性为假
var_dump($attr->isDefault());
 
// 判断属性访问权限
var_dump($attr->isPrivate());
var_dump($attr->isProtected());
var_dump($attr->isPublic());
 
// 判断属性是否为静态
var_dump($attr->isStatic());
}

3、ReflectionMethod类方法的有关信息、ReflectionParameter取回了函数或方法参数的相关信息

if($ref->hasMethod('bar')){
$method = $ref->getMethod('bar');
echo $method->getName(); //获取方法名字
// isAbstract 判断是否是抽象方法
//isConstructor 判断是否是构造方法
//isDestructor 判断是否是析构方法
//isFinal 判断是否是 final 描述的方法
//isPrivate 判断是否是 private 描述的方法
//isProtected 判断是否是 protected 描述的方法
//isPublic 判断是否是 public 描述的方法
//isStatic 判断是否是 static 描述的方法
// 获取参数列表
$parameters = $method->getParameters();
foreach($parameters as $row){
// 这里的 $row 为 ReflectionParameter 实例
echo $row->getName();
echo $row->getClass();
 
// 检查变量是否有默认值
if($row->isDefaultValueAvailable()){
echo $row->getDefaultValue();
}
 
// 获取变量类型
if($row->hasType()){
echo $row->getType();
}
}
}

4、ReflectionParameter取回了函数或方法参数的相关信息、ReflectionFunction一个函数的相关信息

$fun =new \ReflectionFunction('demo');
echo $fun->getName();
$parameters = $fun->getParameters();
foreach($parameters as $row){
 
// 这里的 $row 为 ReflectionParameter 实例
echo $row->getName();
echo $row->getClass();
 
// 检查变量是否有默认值
if($row->isDefaultValueAvailable()){
echo $row->getDefaultValue();
}
 
//获取变量类型
if($row->hasType()){
echo $row->getType();
}
}

--------------------------------------------------------------------
承接网站开发、小程序开发、app开发、商城开发、公众号开发。
百度SEO排名、百度搜索霸屏、软文代写等业务。
联系QQ:2779459018     联系微信:qianxia39

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值