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 用checkbox一次性删除多条记录的方法
Feb 23 PHP
php ftp文件上传函数(基础版)
Jun 03 PHP
利用php实现禁用IE和火狐的缓存问题
Dec 03 PHP
Smarty中的注释和截断功能介绍
Apr 09 PHP
PHP程序员的技术成长规划
Mar 25 PHP
深入浅析PHP无限极分类的案例教程
May 09 PHP
深入了解PHP中的Array数组和foreach
Nov 06 PHP
详解ThinkPHP3.2.3验证码显示、刷新、校验
Dec 29 PHP
超强多功能php绿色集成环境详解
Jan 25 PHP
PHP实现的redis主从数据库状态检测功能示例
Jul 20 PHP
解决php extension 加载顺序问题
Aug 16 PHP
Laravel修改验证提示信息为中文的示例
Oct 23 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加密解密的代码
2007/07/16 PHP
提高php运行速度的一些小技巧分享
2012/07/03 PHP
根据ip调用新浪api获取城市名并转成拼音
2014/03/07 PHP
Yii数据模型中rules类验证器用法分析
2016/07/15 PHP
php使用ftp实现文件上传与下载功能
2017/07/21 PHP
select组合框option的捕捉实例代码
2008/09/30 Javascript
从父页面读取和操作iframe中内容方法
2009/07/25 Javascript
JavaScript获取网页、浏览器、屏幕高度和宽度汇总
2014/12/18 Javascript
javascript实现带节日和农历的日历特效
2015/02/01 Javascript
详细解读JavaScript的跨浏览器事件处理
2015/08/12 Javascript
jQuery模仿京东/天猫商品左侧分类导航菜单效果
2016/06/29 Javascript
js实现简单的碰壁反弹效果
2016/08/30 Javascript
Javascript实现登录记住用户名和密码功能
2017/03/22 Javascript
JS常用正则表达式总结【经典】
2017/05/12 Javascript
详解vue2 $watch要注意的问题
2017/09/08 Javascript
关于预加载InstantClick的问题解决方法
2017/09/12 Javascript
vue2.x+webpack快速搭建前端项目框架详解
2017/11/30 Javascript
Vue 组件封装 并使用 NPM 发布的教程
2018/09/30 Javascript
抖音上用记事本编写爱心小程序教程
2019/04/17 Javascript
JS数组方法shift()、unshift()用法实例分析
2020/01/18 Javascript
[07:20]2014DOTA2西雅图国际邀请赛 选手讲解积分赛第二天
2014/07/11 DOTA
python生成器generator用法实例分析
2015/06/04 Python
Django框架下在URLconf中指定视图缓存的方法
2015/07/23 Python
Python中实现变量赋值传递时的引用和拷贝方法
2018/04/29 Python
django2用iframe标签完成网页内嵌播放b站视频功能
2018/06/20 Python
python实现美团订单推送到测试环境,提供便利操作示例
2019/08/09 Python
Python获取、格式化当前时间日期的方法
2020/02/10 Python
Python实现从N个数中找到最大的K个数
2020/04/02 Python
Python脚本如何在bilibili中查找弹幕发送者
2020/06/04 Python
纯CSS3实现3D旋转书本效果
2016/03/21 HTML / CSS
大学生如何写自荐信
2014/01/08 职场文书
工厂仓管员岗位职责范本
2014/07/17 职场文书
2015年国庆放假通知范文
2015/08/18 职场文书
浅谈Redis存储数据类型及存取值方法
2021/05/08 Redis
详解flex:1什么意思
2022/07/23 HTML / CSS
JS前端可视化canvas动画原理及其推导实现
2022/08/05 Javascript