PHP反射使用实例和PHP反射API的中文说明


Posted in PHP onJuly 02, 2014

最近在开发过程中需要获取某个类方法的参数数量、名称及参数顺序,好根据参数的名称来从$_GET里取值。

如方法原型为test($uid,$score), 那么我就知道需要需要从$_GET取

$uid = $_GET['uid'];
$score = $_GET['score'];

然后调用方法$obj->test($uid,$score)

当然前提是约定好了参数名称和get方法传值变量名一致。

采用PHP的反射API,获得函数参数名称和参数默认值的方法如下:

<?php  

class testClass{  

      

    public function testFunc($param1,$param2=0){  

          

    }  

}  

  

$method = new ReflectionMethod('testClass', 'testFunc');  

$params = $method--->getParameters();  

foreach ($params as $param) {  

    echo 'param name: ' . $param->getName(),"\n";  

    if ($param->isOptional()) {  

        echo 'Default value: ' . $param->getDefaultValue(),"\n";  

    }  

} 

下面是PHP反射API的介绍:

1、用途:
该扩展分析php程序,导出或提取出关于类、方法、属性、参数等的详细信息,包括注释。
Reflection可以说是对php库函数:“Classes/Objects 类/对象函数”的一个扩展。
主要用在通过程序检测现有php程序内部关于类、方法等信息,并做出处理。

2、API概览:

class Reflection { }  

interface Reflector { }  

class ReflectionException extends Exception { }  

class ReflectionFunction implements Reflector { }  

class ReflectionParameter implements Reflector { }  

class ReflectionMethod extends ReflectionFunction { }  

class ReflectionClass implements Reflector { }  

class ReflectionObject extends ReflectionClass { }  

class ReflectionProperty implements Reflector { }  

class ReflectionExtension implements Reflector { } 

3、详细说明:(例子详见php手册)

①Reflection类  

<?php  

class Reflection  

{  

public static mixed export(Reflector r [,bool return])  

//导出一个类或方法的详细信息  

public static array getModifierNames(int modifiers)  

//取得修饰符的名字  

}  

?>  

  

②ReflectionException类  

  

该类继承标准类,没特殊方法和属性。  

  

③ReflectionFunction类  

<?php  

class ReflectionFunction implements Reflector  

{  

final private __clone()  

public object __construct(string name)  

public string __toString()  

public static string export()  

//导出该函数的详细信息  

public string getName()  

//取得函数名  

public bool isInternal()  

//测试是否为系统内部函数  

public bool isUserDefined()  

//测试是否为用户自定义函数  

public string getFileName()  

//取得文件名,包括路径名  

public int getStartLine()  

//取得定义函数的起始行  

public int getEndLine()  

//取得定义函数的结束行  

public string getDocComment()  

//取得函数的注释  

public array getStaticVariables()  

//取得静态变量  

public mixed invoke(mixed* args)  

//调用该函数,通过参数列表传参数  

public mixed invokeArgs(array args)  

//调用该函数,通过数组传参数  

public bool returnsReference()  

//测试该函数是否返回引用  

public ReflectionParameter[] getParameters()  

//取得该方法所需的参数,返回值为对象数组  

public int getNumberOfParameters()  

//取得该方法所需的参数个数  

public int getNumberOfRequiredParameters()  

//取得该方法所需的参数个数  

}  

?>  

  

④ReflectionParameter类:  

<?php  

class ReflectionParameter implements Reflector  

{  

final private __clone()  

public object __construct(string name)  

public string __toString()  

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()  

//取得该参数的默认值  

}  

?>  

  

⑤ReflectionClass类:  

<?php  

class ReflectionClass implements Reflector  

{  

final private __clone()  

public object __construct(string name)  

public string __toString()  

public static string export()  

//导出该类的详细信息  

public string getName()  

//取得类名或接口名  

public bool isInternal()  

//测试该类是否为系统内部类  

public bool isUserDefined()  

//测试该类是否为用户自定义类  

public bool isInstantiable()  

//测试该类是否被实例化过  

public bool hasConstant(string name)  

//测试该类是否有特定的常量  

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()  

//测试该类是否为抽象类  

public bool isFinal()  

//测试该类是否声明为final  

public int getModifiers()  

//取得该类的修饰符,返回值类型可能是个资源类型  

//通过Reflection::getModifierNames($class->getModifiers())进一步读取  

public bool isInstance(stdclass object)  

//测试传入的对象是否为该类的一个实例  

public stdclass newInstance(mixed* args)  

//创建该类实例  

public ReflectionClass getParentClass()  

//取得父类  

public bool isSubclassOf(ReflectionClass class)  

//测试传入的类是否为该类的父类  

public array getStaticProperties()  

//取得该类的所有静态属性  

public mixed getStaticPropertyValue(string name [, mixed default])  

//取得该类的静态属性值,若private,则不可访问  

public void setStaticPropertyValue(string name, mixed value)  

//设置该类的静态属性值,若private,则不可访问,有悖封装原则  

public array getDefaultProperties()  

//取得该类的属性信息,不含静态属性  

public bool isIterateable()  

public bool implementsInterface(string name)  

//测试是否实现了某个特定接口  

public ReflectionExtension getExtension()  

public string getExtensionName()  

}  

?>  

  

⑥ReflectionMethod类:  

<?php  

class ReflectionMethod extends ReflectionFunction  

{  

public __construct(mixed class, string name)  

public string __toString()  

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()  

//测试该方法是否为构造函数  

public bool isDestructor()  

//测试该方法是否为析构函数  

public int getModifiers()  

//取得该方法的修饰符  

public ReflectionClass getDeclaringClass()  

//取得该方法所属的类  

// Inherited from ReflectionFunction  

final private __clone()  

public string getName()  

public bool isInternal()  

public bool isUserDefined()  

public string getFileName()  

public int getStartLine()  

public int getEndLine()  

public string getDocComment()  

public array getStaticVariables()  

public bool returnsReference()  

public ReflectionParameter[] getParameters()  

public int getNumberOfParameters()  

public int getNumberOfRequiredParameters()  

}  

?>  

  

⑦ReflectionProperty类:  

<?php  

class ReflectionProperty implements Reflector  

{  

final private __clone()  

public __construct(mixed class, string name)  

public string __toString()  

public static string export()  

//导出该属性的详细信息  

public string getName()  

//取得该属性名  

public bool isPublic()  

//测试该属性名是否为public  

public bool isPrivate()  

//测试该属性名是否为private  

public bool isProtected()  

//测试该属性名是否为protected  

public bool isStatic()  

//测试该属性名是否为static  

public bool isDefault()  

public int getModifiers()  

//取得修饰符  

public mixed getValue(stdclass object)  

//取得该属性值  

public void setValue(stdclass object, mixed value)  

//设置该属性值  

public ReflectionClass getDeclaringClass()  

//取得定义该属性的类  

public string getDocComment()  

//取得该属性的注释  

}  

?>  

  

⑧ReflectionExtension类  

<?php  

class ReflectionExtension implements Reflector {  

final private __clone()  

public __construct(string name)  

public string __toString()  

  

public static string export()  

//导出该扩展的所有信息  

public string getName()  

//取得该扩展的名字  

public string getVersion()  

//取得该扩展的版本  

public ReflectionFunction[] getFunctions()  

//取得该扩展的所有函数  

public array getConstants()  

//取得该扩展的所有常量  

public array getINIEntries()  

//取得与该扩展相关的,在php.ini中的指令信息  

public ReflectionClass[] getClasses()  

public array getClassNames()  

}  

?> 
PHP 相关文章推荐
虚拟主机中对PHP的特殊设置
Oct 09 PHP
Ajax+PHP 边学边练 之二 实例
Nov 24 PHP
Sorting Array Values in PHP(数组排序)
Sep 15 PHP
php 表单提交大量数据发生丢失的解决方法
Mar 03 PHP
PHP 面向对象程序设计(oop)学习笔记(三) - 单例模式和工厂模式
Jun 12 PHP
thinkphp视图模型查询提示ERR: 1146:Table 'db.pr_order_view' doesn't exist的解决方法
Oct 30 PHP
PHP屏蔽过滤指定关键字的方法
Nov 03 PHP
WIN8.1下搭建PHP5.6环境
Apr 29 PHP
ThinkPHP中Common/common.php文件常用函数功能分析
May 20 PHP
简单解析PHP程序的运行流程
Jun 23 PHP
浅析php如何实现App常用的秒发功能
Aug 03 PHP
PHP大文件及断点续传下载实现代码
Aug 18 PHP
用PHP解决的一个栈的面试题
Jul 02 #PHP
函数中使用require_once问题深入探讨 优雅的配置文件定义方法推荐
Jul 02 #PHP
PHP中遇到BOM、编码导致json_decode函数无法解析问题
Jul 02 #PHP
php foreach正序倒序输出示例代码
Jul 01 #PHP
浅析ThinkPHP的模板输出功能
Jul 01 #PHP
ThinkPHP中的系统常量和预定义常量集合
Jul 01 #PHP
ThinkPHP实现多数据库连接的解决方法
Jul 01 #PHP
You might like
操作Oracle的php类
2006/10/09 PHP
thinkphp浏览历史功能实现方法
2014/10/29 PHP
解决yii2左侧菜单子级无法高亮问题的方法
2016/05/08 PHP
许愿墙中用到的函数
2006/10/07 Javascript
善用事件代理,警惕闭包的性能陷阱。
2011/01/20 Javascript
jquery 循环显示div的示例代码
2013/10/18 Javascript
详解js私有作用域中创建特权方法
2016/01/25 Javascript
实用jquery操作表单元素的简单代码
2016/07/04 Javascript
jQuery插件fullPage.js实现全屏滚动效果
2016/12/02 Javascript
Bootstrap源码解读按钮(5)
2016/12/23 Javascript
3分钟快速搭建nodejs本地服务器方法运行测试html/js
2017/04/01 NodeJs
js禁止浏览器页面后退功能的实例(推荐)
2017/09/01 Javascript
vue2 mint-ui loadmore实现下拉刷新,上拉更多功能
2018/03/21 Javascript
[01:08]2014DOTA2展望TI 剑指西雅图LGD战队专访
2014/06/30 DOTA
[04:17]DOTA2完美盛典,rOtk、BurNIng携手巴图演唱《倔强》
2017/11/28 DOTA
[20:39]DOTA2-DPC中国联赛 正赛开幕式 1月18日
2021/03/11 DOTA
Linux下Python获取IP地址的代码
2014/11/30 Python
Python打印输出数组中全部元素
2018/03/13 Python
Python使用pymysql从MySQL数据库中读出数据的方法
2018/07/25 Python
为什么str(float)在Python 3中比Python 2返回更多的数字
2018/10/16 Python
python使用thrift教程的方法示例
2019/03/21 Python
对Python函数设计规范详解
2019/07/19 Python
Python如何使用BeautifulSoup爬取网页信息
2019/11/26 Python
pycharm如何实现跨目录调用文件
2020/02/28 Python
解决更改AUTH_USER_MODEL后出现的问题
2020/05/14 Python
Python如何使用vars返回对象的属性列表
2020/10/17 Python
Bowflex美国官方网站:高级家庭健身器材
2017/12/22 全球购物
Bealls Florida百货商店:生活服饰、家居装饰和鞋子
2018/02/23 全球购物
Otiumberg官网:英国半精致珠宝品牌
2021/01/16 全球购物
英国时尚首饰品牌:Missoma
2020/06/29 全球购物
输入N,打印N*N矩阵
2012/02/20 面试题
本科毕业生应聘自荐信范文
2014/06/26 职场文书
安全生产一岗双责责任书
2014/07/28 职场文书
python 如何做一个识别率百分百的OCR
2021/05/29 Python
pandas中DataFrame数据合并连接(merge、join、concat)
2021/05/30 Python
mysql使用instr达到in(字符串)的效果
2022/04/03 MySQL