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下判断数组中是否存在相同的值array_unique
Mar 25 PHP
PHP 5.3 下载时 VC9、VC6、Thread Safe、Non Thread Safe的区别分析
Mar 28 PHP
php中explode与split的区别介绍
Oct 03 PHP
php 批量替换html标签的实例代码
Nov 26 PHP
PHP滚动日志的代码实现
Jun 10 PHP
php格式化json函数示例代码
May 12 PHP
php封装的page分页类完整实例
Oct 18 PHP
详谈php中 strtr 和 str_replace 的效率问题
May 14 PHP
Yii框架实现多数据库配置和操作的方法
May 25 PHP
PHP依赖注入(DI)和控制反转(IoC)详解
Jun 12 PHP
PHP实现获取ip地址的5种方法,以及插入用户登录日志操作示例
Feb 28 PHP
php实现JWT(json web token)鉴权实例详解
Nov 05 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 获取时间今天明天昨天时间戳的详解
2013/06/20 PHP
php生成txt文件标题及内容的方法
2014/01/16 PHP
php实现网页缓存的工具类分享
2015/07/14 PHP
织梦sitemap地图实时推送给百度的教程
2015/08/03 PHP
微信公众平台开发-微信服务器IP接口实例(含源码)
2017/03/05 PHP
prototype 1.5 &amp; scriptaculous 1.6.1 学习笔记
2006/09/07 Javascript
Jquery 例外被抛出且未被接住原因介绍
2013/09/04 Javascript
extjs表格文本启用选择复制功能具体实现
2013/10/11 Javascript
JSON无限折叠菜单编写实例
2013/12/16 Javascript
js jquery ajax的几种用法总结(及优缺点介绍)
2014/01/28 Javascript
jquery 按键盘上的enter事件
2014/05/11 Javascript
CSS3,HTML5和jQuery搜索框集锦
2014/12/02 Javascript
js实现将选中内容分享到新浪或腾讯微博
2015/12/16 Javascript
JS组件中bootstrap multiselect两大组件较量
2016/01/26 Javascript
利用jquery实现瀑布流3种案例
2016/09/18 Javascript
基于Vue组件化的日期联动选择器功能的实现代码
2018/11/30 Javascript
vue2.0 解决抽取公用js的问题
2020/07/31 Javascript
一篇文章带你从零快速上手Rollup
2020/09/07 Javascript
微信小程序实现加入购物车滑动轨迹
2020/11/18 Javascript
Python pickle类库介绍(对象序列化和反序列化)
2014/11/21 Python
浅析Python中的序列化存储的方法
2015/04/28 Python
python修改操作系统时间的方法
2015/05/18 Python
Python中的rjust()方法使用详解
2015/05/19 Python
django中模板的html自动转意方法
2018/05/27 Python
Python的in,is和id函数代码实例
2020/04/18 Python
基于Python的自媒体小助手---登录页面的实现代码
2020/06/29 Python
英国领先的在线鱼贩:The Fish Society
2020/08/12 全球购物
SQL Server 2000数据库的文件有哪些,分别进行描述。
2015/11/09 面试题
类的返射机制中的包及核心类
2016/09/12 面试题
学校工作推荐信范文
2014/07/11 职场文书
2014年学校党建工作汇报材料
2014/11/02 职场文书
2014年物业管理工作总结
2014/11/21 职场文书
植物园观后感
2015/06/11 职场文书
张丽莉事迹观后感
2015/06/16 职场文书
谢师宴家长答谢词
2015/09/30 职场文书
导游词之大雁塔景区
2019/09/17 职场文书