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中$_SERVER的详细参数与说明
Jul 29 PHP
快速开发一个PHP扩展图文教程
Dec 12 PHP
Ajax+PHP边学边练 之五 图片处理
Dec 03 PHP
队列在编程中的实际应用(php)
Sep 04 PHP
PHP容易被忽略而出错陷阱 数字与字符串比较
Nov 10 PHP
php 网上商城促销设计实例代码
Feb 17 PHP
浅析php变量修饰符static的使用
Jun 28 PHP
php使用正则表达式提取字符串中尖括号、小括号、中括号、大括号中的字符串
Apr 05 PHP
php实现的太平洋时间和北京时间互转的自定义函数分享
Aug 19 PHP
laravel unique验证、确认密码confirmed验证以及密码修改验证的方法
Oct 16 PHP
PHP随机生成中文段落示例【测试网站内容时使用】
Apr 26 PHP
PHP使用POP3读取邮箱接收邮件的示例代码
Jul 08 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获取当前所在目录位置的方法
2014/11/26 PHP
php简单统计字符串单词数量的方法
2015/06/19 PHP
javascript各种复制代码收集
2008/09/20 Javascript
javascript globalStorage类代码
2009/06/04 Javascript
该如何加载google-analytics(或其他第三方)的JS
2010/05/13 Javascript
深入解析JavaScript的闭包机制
2015/10/20 Javascript
详解JavaScript常量定义
2017/01/03 Javascript
jQuery插件ajaxFileUpload使用详解
2017/01/10 Javascript
JS常见简单正则表达式验证功能小结【手机,地址,企业税号,金额,身份证等】
2017/01/22 Javascript
Vue导出页面为PDF格式的实现思路
2018/07/31 Javascript
node.js实现为PDF添加水印的示例代码
2018/12/05 Javascript
Vue组件通信的几种实现方法
2019/04/25 Javascript
基于VUE的v-charts的曲线显示功能
2019/10/01 Javascript
[03:17]史诗级大片应援2018DOTA2国际邀请赛 致敬每一位坚守遗迹的勇士
2018/07/20 DOTA
Web服务器框架 Tornado简介
2014/07/16 Python
在Python的列表中利用remove()方法删除元素的教程
2015/05/21 Python
python 将大文件切分为多个小文件的实例
2019/01/14 Python
Python一行代码实现快速排序的方法
2019/04/30 Python
将python文件打包成EXE应用程序的方法
2019/05/22 Python
详细介绍pandas的DataFrame的append方法使用
2019/07/31 Python
python DataFrame转dict字典过程详解
2019/12/26 Python
Python的赋值、深拷贝与浅拷贝的区别详解
2020/02/12 Python
tensorflow将图片保存为tfrecord和tfrecord的读取方式
2020/02/17 Python
CSS3中HSL和HSLA的简单使用示例
2015/07/14 HTML / CSS
html5教程制作简单画板代码分享
2013/12/04 HTML / CSS
伦敦平价潮流珠宝首饰品牌:Astrid & Miyu
2016/10/10 全球购物
Public Desire美国/加拿大:全球性的在线鞋类品牌
2018/12/17 全球购物
英国护发和美妆在线商店:Klip Shop
2019/03/24 全球购物
诚信的演讲稿范文
2014/05/12 职场文书
甘南现象心得体会
2014/09/11 职场文书
学习朴航瑛老师爱岗敬业先进事迹思想汇报
2014/09/17 职场文书
践行三严三实心得体会(2016推荐篇)
2016/01/06 职场文书
七年级之开学家长寄语35句
2019/09/05 职场文书
python异常中else的实例用法
2021/06/15 Python
SQL IDENTITY_INSERT作用案例详解
2021/08/23 MySQL
详解Python中__new__方法的作用
2022/03/31 Python