PHP的反射类ReflectionClass、ReflectionMethod使用实例


Posted in PHP onAugust 05, 2014

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

反射是什么?

它是指在PHP运行状态中,扩展分析PHP程序,导出或提取出关于类、方法、属性、参数等的详细信息,包括注释。这种动态获取的信息以及动态调用对象的方法的功能称为反射API。反射是操纵面向对象范型中元模型的API,其功能十分强大,可帮助我们构建复杂,可扩展的应用。

其用途如:自动加载插件,自动生成文档,甚至可用来扩充PHP语言。

PHP反射api由若干类组成,可帮助我们用来访问程序的元数据或者同相关的注释交互。借助反射我们可以获取诸如类实现了那些方法,创建一个类的实例(不同于用new创建),调用一个方法(也不同于常规调用),传递参数,动态调用类的静态方法。
反射api是PHP内建的OOP技术扩展,包括一些类,异常和接口,综合使用他们可用来帮助我们分析其它类,接口,方法,属性,方法和扩展。这些OOP扩展被称为反射。

平常我们用的比较多的是 ReflectionClass类 和 ReflectionMethod类,例如:

<?php

class Person {
 /**

  * For the sake of demonstration, we"re setting this private

  */

 private $_allowDynamicAttributes = false;
 /**

  * type=primary_autoincrement

  */

 protected $id = 0;
 /**

  * type=varchar length=255 null

  */

 protected $name;
 /**

  * type=text null

  */

 protected $biography;
 public function getId() {

  return $this->id;

 }
 public function setId($v) {

  $this->id = $v;

 }
 public function getName() {

  return $this->name;

 }
 public function setName($v) {

  $this->name = $v;

 }
 public function getBiography() {

  return $this->biography;

 }
 public function setBiography($v) {

  $this->biography = $v;

 }

}

一、通过ReflectionClass,我们可以得到Person类的以下信息:

1.常量 Contants
2.属性 Property Names
3.方法 Method Names静态
4.属性 Static Properties
5.命名空间 Namespace
6.Person类是否为final或者abstract
7.Person类是否有某个方法

接下来反射它,只要把类名"Person"传递给ReflectionClass就可以了:

$class = new ReflectionClass('Person'); // 建立 Person这个类的反射类  

$instance  = $class->newInstanceArgs($args); // 相当于实例化Person 类 

1)获取属性(Properties):

$properties = $class->getProperties();

foreach ($properties as $property) {

 echo $property->getName() . "\n";

}

// 输出:

// _allowDynamicAttributes

// id

// name

// biography

默认情况下,ReflectionClass会获取到所有的属性,private 和 protected的也可以。如果只想获取到private属性,就要额外传个参数:

$private_properties = $class->getProperties(ReflectionProperty::IS_PRIVATE);

可用参数列表:

ReflectionProperty::IS_STATIC

ReflectionProperty::IS_PUBLIC

ReflectionProperty::IS_PROTECTED

ReflectionProperty::IS_PRIVATE

通过$property->getName()可以得到属性名。

2)获取注释:

通过getDocComment可以得到写给property的注释。

foreach ($properties as $property) {

 if ($property->isProtected()) {

  $docblock = $property->getDocComment();

  preg_match('/ type\=([a-z_]*) /', $property->getDocComment(), $matches);

  echo $matches[1] . "\n";

 }

}

// Output:

// primary_autoincrement

// varchar

// text

3)获取类的方法

getMethods()       来获取到类的所有methods。

hasMethod(string)  是否存在某个方法

getMethod(string)  获取方法

4)执行类的方法:

$instance->getName(); // 执行Person 里的方法getName

// 或者:

$method = $class->getmethod('getName'); // 获取Person 类中的getName方法

$method->invoke($instance);    // 执行getName 方法

// 或者:

$method = $class->getmethod('setName'); // 获取Person 类中的setName方法

$method->invokeArgs($instance, array('snsgou.com'));

二、通过ReflectionMethod,我们可以得到Person类的某个方法的信息:

1.是否“public”、“protected”、“private” 、“static”类型
2.方法的参数列表
3.方法的参数个数
4.反调用类的方法

// 执行detail方法

$method = new ReflectionMethod('Person', 'test');
if ($method->isPublic() && !$method->isStatic()) {

 echo 'Action is right';

}

echo $method->getNumberOfParameters(); // 参数个数

echo $method->getParameters(); // 参数对象数组
PHP 相关文章推荐
PHP文件读写操作之文件写入代码
Jan 13 PHP
PHP写的求多项式导数的函数代码
Jul 04 PHP
php setcookie(name, value, expires, path, domain, secure) 参数详解
Jun 28 PHP
php设置session值和cookies的学习示例
Mar 21 PHP
PHP 只允许指定IP访问(允许*号通配符过滤IP)
Jul 08 PHP
浅谈PHP中JSON数据操作
Jul 01 PHP
PHP和Mysql中转UTF8编码问题汇总
Oct 10 PHP
Linux系统下使用XHProf和XHGui分析PHP运行性能
Dec 08 PHP
PHP多维数组遍历方法(2种实现方法)
Dec 10 PHP
浅析Yii2 gridview实现批量删除教程
Apr 22 PHP
PHP引用返回用法示例
May 28 PHP
php使用GD2绘制几何图形示例
Feb 15 PHP
实例介绍PHP的Reflection反射机制
Aug 05 #PHP
PHP中读取文件的8种方法和代码实例
Aug 05 #PHP
PHP中Fatal error session_start()错误解决步骤
Aug 05 #PHP
PHP学习笔记(二) 了解PHP的基本语法以及目录结构
Aug 04 #PHP
PHP学习笔记(一) 简单了解PHP
Aug 04 #PHP
linux下安装php的memcached客户端
Aug 03 #PHP
Linux下创建nginx脚本-start、stop、reload…
Aug 03 #PHP
You might like
php查看网页源代码的方法
2015/03/13 PHP
PHP导出Excel实例讲解
2016/01/24 PHP
Zend Framework教程之Resource Autoloading用法实例
2016/03/08 PHP
Netbeans 8.2与PHP相关的新特性介绍
2016/10/08 PHP
php获取数据库结果集方法(推荐)
2017/06/01 PHP
php利用array_search与array_column实现二维数组查找
2019/07/08 PHP
jquery 打开窗口返回值实现代码
2010/03/04 Javascript
javascript实现原生ajax的几种方法介绍
2013/09/21 Javascript
JavaScript操作URL的相关内容集锦
2015/10/29 Javascript
原生JS封装Ajax插件(同域、jsonp跨域)
2016/05/03 Javascript
vue中将网页打印成pdf实例代码
2017/06/15 Javascript
Nodejs实现爬虫抓取数据实例解析
2018/07/05 NodeJs
JS操作字符串转数字的常见方法示例
2019/10/29 Javascript
微信小程序实现弹框效果
2020/05/26 Javascript
[01:03]DOTA2新的征程 你的脚印值得踏上
2014/08/13 DOTA
Python操作MySQL模拟银行转账
2018/03/12 Python
在Python 中同一个类两个函数间变量的调用方法
2019/01/31 Python
python中多个装饰器的调用顺序详解
2019/07/16 Python
关于tensorflow softmax函数用法解析
2020/06/30 Python
CSS3中Animation动画属性用法详解
2016/07/04 HTML / CSS
局部内部类是否可以访问非final变量?
2013/04/20 面试题
ajax是什么及其工作原理
2012/02/08 面试题
生物科学专业个人求职信范文
2013/12/05 职场文书
大学生秋游活动方案
2014/02/17 职场文书
学校安全防火方案
2014/06/07 职场文书
行政管理专业求职信
2014/07/06 职场文书
四风查摆问题自查报告
2014/10/10 职场文书
民主评议党员自我鉴定
2014/10/21 职场文书
2014年档案管理员工作总结
2014/12/01 职场文书
小学家长通知书评语
2014/12/31 职场文书
python如何获取网络数据
2021/04/11 Python
Python基础之Socket通信原理
2021/04/22 Python
Pygame Event事件模块的详细示例
2021/11/17 Python
关于python3 opencv 图像二值化的问题(cv2.adaptiveThreshold函数)
2022/04/04 Python
Go语言 详解net的tcp服务
2022/04/14 Golang
uniapp引入支付宝原生扫码插件步骤详解
2022/07/23 Javascript