PHP 反射(Reflection)使用实例


Posted in PHP onMay 12, 2015

PHP Reflection是用于获取类、扩展、方法、函数、对象、参数、属性的详细信息。
ReflectionClass类获取类相关信息,如获取属性、方法、文档注释等。

<?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::export('Person');
 
$r = new ReflectionClass('Person');
 
//获取所有属性
print_r($r->getProperties());
 
/**
 * 获取指定属性
 * ReflectionProperty::IS_STATIC
 * ReflectionProperty::IS_PUBLIC
 * ReflectionProperty::IS_PROTECTED
 * ReflectionProperty::IS_PRIVATE
 */
print_r($r->getProperties(ReflectionProperty::IS_PRIVATE));
 
//获取注释
print_r($r->getProperty('id')->getDocComment());
 
//获取方法
print_r($r->getMethods());

ReflectionExtension 类用于获取扩展相关信息

$re = new ReflectionExtension('Reflection');
print_r($re->getClasses()); //扩展的所有类
print_r($re->getClassNames()); //扩展所有类名
 
$dom = new ReflectionExtension('mysql');
print_r($dom->getConstants());//扩展常量
print_r($dom->getDependencies());//该扩展依赖
print_r($dom->getFunctions());//扩展方法
print_r($dom->getINIEntries());//扩展ini信息
print_r($dom->getName());//扩展名称
print_r($dom->getVersion());//扩展版本
print_r($dom->info());//扩展信息
print_r($dom->isPersistent());//是否是持久扩展
print_r($dom->isTemporary()); //是否是临时扩展

 ReflectionFunction类 用户获取函数相关信息

$rf = new ReflectionFunction('array_merge');
 
foreach($rf->getParameters() as $item) {
  echo $item . PHP_EOL;
}

ReflectionMethod类用户获取方法相关信息

class Person {
 
  public $name;
 
  /**
   * get name of person
   */
  public function getName()
  {
    return $this->name;
  }
  public function setName($v)
  {
    $this->name = $v;
  }
}
 
$rm = new ReflectionMethod('Person', 'getName');
 
print_r($rm->isPublic());
print_r($rm->getDocComment());

ReflectionObject 类 用于获取对象相关信息

class Person {
 
  public $name;
 
  public function __construct($name)
  {
    $this->name = $name;
  }
  
  public function getName()
  {
    return $this->name;
  }
  
  public function setName($v)
  {
    $this->name = $v;
  }
}
 
$a = new Person('a');
 
$ro = new ReflectionObject($a);
 
print_r($ro->getMethods());

ReflectionParameter 获取函数或方法参数的相关信息。

class Person {
 
  public $name;
 
  public function __construct($name)
  {
    $this->name = $name;
  }
 
  public function getName()
  {
    return $this->name;
  }
 
  public function setName($v)
  {
    $this->name = $v;
  }
}
 
$p = new ReflectionParameter(array('Person', 'setName'), 0);
 
print_r($p->getPosition()); //0
print_r($p->getName()); //v

ReflectionProperty 获取类的属性的相关信息。

class Person {
 
  /** 测试 */
  public $name;
 
  public function __construct($name)
  {
    $this->name = $name;
  }
 
  public function getName()
  {
    return $this->name;
  }
 
  public function setName($v)
  {
    $this->name = $v;
  }
}
 
$p = new ReflectionProperty('Person', 'name');
 
print_r($p->getDocComment());
PHP 相关文章推荐
计算2000年01月01日起到指定日的天数
Oct 09 PHP
怎样在php中使用PDF文档功能
Oct 09 PHP
php学习 字符串课件
Jun 15 PHP
php FPDF类库应用实现代码
Mar 20 PHP
php 运行效率总结(提示程序速度)
Nov 26 PHP
在PHP中运行Linux命令并启动SSH服务的例子
Jun 12 PHP
PHP实现支持GET,POST,Multipart/form-data的HTTP请求类
Sep 24 PHP
thinkphp模板继承实例简述
Nov 26 PHP
php获取YouTube视频信息的方法
Feb 11 PHP
PHP生成随机密码方法汇总
Aug 27 PHP
PHP类和对象相关系统函数与运算符小结
Sep 28 PHP
laravel 5.3中自定义加密服务的方案详解
May 09 PHP
PHP Reflection API详解
May 12 #PHP
php通过curl模拟登陆DZ论坛
May 11 #PHP
PHP中的魔术方法总结和使用实例
May 11 #PHP
php基于curl扩展制作跨平台的restfule 接口
May 11 #PHP
PHP SPL标准库中的常用函数介绍
May 11 #PHP
PHP中的类型约束介绍
May 11 #PHP
PHP SPL标准库之接口(Interface)详解
May 11 #PHP
You might like
set_include_path在win和linux下的区别
2008/01/10 PHP
php实现基于微信公众平台开发SDK(demo)扩展的方法
2014/12/22 PHP
表单的一些基本用法与技巧
2006/07/15 Javascript
PJBlog插件 防刷新的在线播放器
2006/10/25 Javascript
短信提示使用 特效
2007/01/19 Javascript
File文件控件,选中文件(图片,flash,视频)即立即预览显示
2009/04/09 Javascript
图片上传插件jquery.uploadify详解
2013/11/15 Javascript
jquery easyui中treegrid用法的简单实例
2014/02/18 Javascript
jquery动态添加删除一行数据示例
2014/06/12 Javascript
使用JavaScript的AngularJS库编写hello world的方法
2015/06/23 Javascript
浅析nodejs实现Websocket的数据接收与发送
2015/11/19 NodeJs
AngularJS入门教程之AngularJS 模板
2016/08/18 Javascript
JavaScript学习笔记整理_简单实现枚举类型,扑克牌应用
2016/09/19 Javascript
Vue2.0 组件传值通讯的示例代码
2017/08/01 Javascript
引入JavaScript时alert弹出框显示中文乱码问题
2017/09/16 Javascript
详解vue2.0+vue-video-player实现hls播放全过程
2018/03/02 Javascript
解决Vue+Element ui开发中碰到的IE问题
2018/09/03 Javascript
atom-design(Vue.js移动端组件库)手势组件使用教程
2019/05/16 Javascript
layui将table转化表单显示的方法(即table.render转为表单展示)
2019/09/24 Javascript
jQuery操作元素的内容和样式完整实例分析
2020/01/10 jQuery
解决echarts图表使用v-show控制图表显示不全的问题
2020/07/19 Javascript
Mac中Python 3环境下安装scrapy的方法教程
2017/10/26 Python
python 判断网络连通的实现方法
2018/04/22 Python
Python 限制线程的最大数量的方法(Semaphore)
2019/02/22 Python
linux安装python修改默认python版本方法
2019/03/31 Python
python编程进阶之类和对象用法实例分析
2020/02/21 Python
用Python绘制漫步图实例讲解
2020/02/26 Python
Python实现读取并写入Excel文件过程解析
2020/05/27 Python
Python pip install之SSL异常处理操作
2020/09/03 Python
澳洲国民品牌乡村路折扣店:Country Road & Trenery Outlet
2018/04/19 全球购物
物流专业大学生求职信范文
2013/10/28 职场文书
寒假实习自荐信
2014/01/26 职场文书
竞选部门副经理的自荐书范文
2014/02/11 职场文书
计算机专业毕业生求职信
2014/04/30 职场文书
使用redis生成唯一编号及原理示例详解
2021/09/15 Redis
Smart 2 车辆代号 HC11 全新谍照曝光
2022/04/21 数码科技