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实现的在线人员函数库
Apr 09 PHP
php cookie 作用范围?不要在当前页面使用你的cookie
Mar 24 PHP
Discuz Uchome ajaxpost小技巧
Jan 04 PHP
linux命令之调试工具strace的深入分析
Jun 03 PHP
请离开include_once和require_once
Jul 18 PHP
php中JSON的使用与转换
Jan 14 PHP
php调用淘宝开放API实现根据卖家昵称获取卖家店铺ID的方法
Jul 29 PHP
反射调用private方法实践(php、java)
Dec 21 PHP
thinkphp5 加载静态资源路径与常量的方法
Dec 24 PHP
php使用imagecopymerge()函数创建半透明水印
Jan 25 PHP
PHP的Trait机制原理与用法分析
Oct 18 PHP
PHP日期和时间函数的使用示例详解
Aug 06 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 变量定义方法
2009/06/14 PHP
Smarty简单生成表单元素的方法示例
2016/05/23 PHP
php实现对文件压缩简单的方法
2019/09/29 PHP
Laravel框架基础语法与知识点整理【模板变量、输出、include引入子视图等】
2019/12/03 PHP
js 禁用只读文本框获得焦点时的退格键
2010/04/25 Javascript
extjs实现选择多表自定义查询功能 前台部分(ext源码)
2011/12/20 Javascript
javascript学习笔记(十五) js间歇调用和超时调用
2012/06/20 Javascript
利用js实现前台动态添加文本框,后台获取文本框内容(示例代码)
2013/11/25 Javascript
举例说明如何为JavaScript的方法参数设置默认值
2015/11/17 Javascript
浅谈React 属性和状态的一些总结
2016/11/21 Javascript
Javascript基础回顾之(一) 类型
2017/01/31 Javascript
详解javascript立即执行函数表达式IIFE
2017/02/13 Javascript
JS非行间样式获取函数的实例代码
2018/06/05 Javascript
Web安全之XSS攻击与防御小结
2018/12/13 Javascript
layui: layer.open加载窗体时出现遮罩层的解决方法
2019/09/26 Javascript
解决vue 表格table列求和的问题
2019/11/06 Javascript
Python 闭包的使用方法
2017/09/07 Python
Python使用Turtle模块绘制五星红旗代码示例
2017/12/11 Python
Python采集代理ip并判断是否可用和定时更新的方法
2018/05/07 Python
python简易实现任意位数的水仙花实例
2018/11/13 Python
pytorch 利用lstm做mnist手写数字识别分类的实例
2020/01/10 Python
简单了解python filter、map、reduce的区别
2020/01/14 Python
tensorflow基于CNN实战mnist手写识别(小白必看)
2020/07/20 Python
Europcar葡萄牙:葡萄牙汽车和货车租赁
2017/10/13 全球购物
台湾流行服饰购物平台:OB严选
2018/01/21 全球购物
白俄罗斯大卖场:21vek.by
2019/07/25 全球购物
JAVA语言如何进行异常处理,关键字:throws,throw,try,catch,finally分别代表什么意义?在try块中可以抛出异常吗?
2013/07/02 面试题
自荐书4要点
2014/01/25 职场文书
政府班子四风问题整改措施思想汇报
2014/10/08 职场文书
班主任工作实习计划
2015/01/16 职场文书
2016党员发展对象培训心得体会
2016/01/08 职场文书
导游词之上海东方明珠塔
2019/09/25 职场文书
教你怎么用python爬取爱奇艺热门电影
2021/05/20 Python
Django使用channels + websocket打造在线聊天室
2021/05/20 Python
服务器间如何实现文件共享
2022/05/20 Servers
python 使用pandas读取csv文件的方法
2022/12/24 Python