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中通过ADODB库实现调用Access数据库之修正版本
Dec 31 PHP
php与paypal整合方法
Nov 28 PHP
php中模拟POST传递数据的两种方法分享
Sep 16 PHP
php模板函数 正则实现代码
Oct 15 PHP
php实现数组筛选奇数和偶数示例
Apr 11 PHP
dvwa+xampp搭建显示乱码的问题及解决方案
Aug 23 PHP
CodeIgniter控制器之业务逻辑实例分析
Jan 20 PHP
PHP二进制与字符串之间的相互转换教程
Oct 14 PHP
PHP实现根据数组的值进行分组的方法
Apr 20 PHP
PHP+Redis 消息队列 实现高并发下注册人数统计的实例
Jan 29 PHP
PHP实现生成推广海报的方法详解
Mar 14 PHP
Laravel关联模型中过滤结果为空的结果集(has和with区别)
Oct 18 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 网页游戏开发入门教程一(webgame+design)
2009/10/26 PHP
PHP教程之PHP中shell脚本的使用方法分享
2012/02/23 PHP
php采集文章中的图片获取替换到本地(实现代码)
2013/07/08 PHP
改写ThinkPHP的U方法使其路由下分页正常
2014/07/02 PHP
初识php MVC
2014/09/10 PHP
PHP实现小偷程序实例
2016/10/31 PHP
php微信公众号开发模式详解
2016/11/28 PHP
Laravel框架实现model层的增删改查(CURD)操作示例
2018/05/12 PHP
thinkPHP5框架路由常用知识点汇总
2019/09/15 PHP
js渐变显示渐变消失示例代码
2013/08/01 Javascript
一款由jquery实现的整屏切换特效
2014/09/15 Javascript
js基础知识(公有方法、私有方法、特权方法)
2015/11/06 Javascript
javascript用正则表达式过滤空格的实现代码
2016/06/14 Javascript
BooStrap对导航条的改造实践小结
2016/09/21 Javascript
jquery插入兄弟节点的操作方法
2016/12/07 Javascript
js实现数组去重方法及效率?Ρ? target=
2017/02/14 Javascript
bootstrap datepicker插件默认英文修改为中文
2017/07/28 Javascript
pm2 部署 node的三种方法示例
2017/10/20 Javascript
jQuery实现的导航条点击后高亮显示功能示例
2019/03/04 jQuery
vue-cli3中vue.config.js配置教程详解
2019/05/29 Javascript
vue 兄弟组件的信息传递的方法实例详解
2019/08/30 Javascript
vue项目配置使用flow类型检查的步骤
2020/03/18 Javascript
python @property的用法及含义全面解析
2018/02/01 Python
django缓存配置的几种方法详解
2018/07/16 Python
Python发展史及网络爬虫
2019/06/19 Python
python字符串查找函数的用法详解
2019/07/08 Python
浅谈tensorflow中dataset.shuffle和dataset.batch dataset.repeat注意点
2020/06/08 Python
玛蒂尔达简服装:Matilda Jane Clothing
2019/02/13 全球购物
德国排名第一的主题公园门票网站:Attraction Tickets Direct
2019/09/09 全球购物
Vertbaudet西班牙网上商店:婴儿服装、童装、母婴用品和儿童家具
2019/10/16 全球购物
一份全面的PHP面试问题考卷
2012/07/15 面试题
市政施工员自我鉴定
2014/01/15 职场文书
乡镇综治宣传月活动总结
2014/07/02 职场文书
2019学生会干事辞职信
2019/06/27 职场文书
Python实现Telnet自动连接检测密码的示例
2021/04/16 Python
Redis RDB技术底层原理详解
2021/09/04 Redis