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 相关文章推荐
我常用的几个类
Oct 09 PHP
分享PHP入门的学习方法
Jan 02 PHP
php 使用post,get的一种简洁方式
Apr 25 PHP
PHP文件打开、关闭、写入的判断与执行代码
May 24 PHP
PHP 观察者模式的实现代码
May 10 PHP
php中file_exists函数使用详解
May 08 PHP
CodeIgniter针对lighttpd服务器URL重写的方法
Jun 10 PHP
四个PHP非常实用的功能
Sep 29 PHP
Yii2简单实现多语言配置的方法
Jul 23 PHP
关于Laravel Route重定向的一个注意点
Jan 16 PHP
Yii Framework框架使用PHPExcel组件的方法示例
Jul 24 PHP
php实现根据身份证获取精准年龄
Feb 26 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 工厂模式使用方法
2010/05/18 PHP
php创建和删除目录函数介绍和递归删除目录函数分享
2014/11/18 PHP
Thinkphp和Bootstrap结合打造个性的分页样式(推荐)
2016/08/01 PHP
PHP接入微信H5支付的方法示例
2019/10/28 PHP
javascript开发技术大全 第4章 直接量与字符集
2011/07/03 Javascript
js保留两位小数使用toFixed实现
2013/07/29 Javascript
javascript实现原生ajax的几种方法介绍
2013/09/21 Javascript
很不错的两款Bootstrap Icon图标选择组件
2016/01/28 Javascript
jquery.cookie.js实现用户登录保存密码功能的方法
2016/04/15 Javascript
Javascript中的数组常用方法解析
2016/06/17 Javascript
jQuery实现的瀑布流加载效果示例
2016/09/13 Javascript
JavaScript对象封装的简单实现方法(3种方法)
2017/01/03 Javascript
javascript判断回文数详解及实现代码
2017/02/03 Javascript
JS去掉字符串前后空格或去掉所有空格的用法
2017/03/25 Javascript
javascript  数组排序与对象排序的实例
2017/07/17 Javascript
判断div滑动到底部的scroll实例代码
2017/11/15 Javascript
如何快速解决JS或Jquery ajax异步跨域的问题
2018/01/08 jQuery
react 应用多入口配置及实践总结
2018/10/17 Javascript
解决vue v-for src 图片路径问题 404
2019/11/12 Javascript
Vue实现图书管理案例
2021/01/20 Vue.js
[02:58]献给西雅图的情书_高清
2014/05/29 DOTA
[07:40]DOTA2每周TOP10 精彩击杀集锦vol.4
2014/06/25 DOTA
Python中编写ORM框架的入门指引
2015/04/29 Python
如何用OpenCV -python3实现视频物体追踪
2019/12/04 Python
python mysql自增字段AUTO_INCREMENT值的修改方式
2020/05/18 Python
法国足球商店:Footcenter
2019/07/06 全球购物
奥地利购买珠宝和手表网站:ELLA JUWELEN
2019/09/03 全球购物
工程造价与财务管理专业应届生求职信
2013/10/06 职场文书
金融专业个人的自我评价
2013/10/18 职场文书
捐赠仪式主持词
2014/03/19 职场文书
我的中国梦演讲稿500字
2014/08/19 职场文书
公司的门卫岗位职责
2014/09/09 职场文书
团党委领导干部党的群众路线教育实践活动个人对照检查材料思想汇
2014/10/05 职场文书
作风转变年心得体会
2014/10/22 职场文书
2020年元旦晚会策划书模板
2019/12/30 职场文书
IDEA 链接Mysql数据库并执行查询操作的完整代码
2021/05/20 MySQL