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 相关文章推荐
用PHP读取flv文件的播放时间长度
Sep 03 PHP
用PHP读取超大文件的实例代码
Apr 01 PHP
PHP数据流应用的一个简单实例
Sep 14 PHP
深入理解require与require_once与include以及include_once的区别
Jun 05 PHP
php遍历树的常用方法汇总
Jun 18 PHP
php关闭warning问题的解决方法
May 17 PHP
PHP如何实现跨域
May 30 PHP
PHP网页安全认证的实例详解
Sep 28 PHP
实例讲解php将字符串输出到HTML
Jan 27 PHP
PHP Include文件实例讲解
Feb 15 PHP
php+mysql开发的最简单在线题库(在线做题系统)完整案例
Mar 30 PHP
Laravel ORM 数据model操作教程
Oct 21 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
在Windows系统下使用PHP生成Word文档的教程
2015/07/03 PHP
在Mac OS上自行编译安装Apache服务器和PHP解释器
2015/12/24 PHP
WordPress中设置Post Type自定义文章类型的实例教程
2016/05/10 PHP
PHP实现清除MySQL死连接的方法
2016/07/23 PHP
php实现图片压缩处理
2020/09/09 PHP
浅析document.ready和window.onload的区别讲解
2013/12/18 Javascript
浅谈JavaScript数据类型及转换
2015/02/28 Javascript
JavaScript DOM 学习总结(五)
2015/11/24 Javascript
jQuery简单动画变换效果实例分析
2016/07/04 Javascript
jQuery实现可展开折叠的导航效果示例
2016/09/12 Javascript
js浏览器html5表单验证
2016/10/17 Javascript
jstree的简单实例
2016/12/01 Javascript
微信小程序 UI布局常用技巧整理总结
2016/12/05 Javascript
67 个节约开发时间的前端开发者的工具、库和资源
2017/09/12 Javascript
vue.js select下拉框绑定和取值方法
2018/03/03 Javascript
Angular异步变同步处理方法
2018/08/13 Javascript
灵活使用console让js调试更简单的方法步骤
2019/04/23 Javascript
layer.js之回调销毁对话框的例子
2019/09/11 Javascript
[02:35]DOTA2英雄基础教程 狙击手
2014/01/14 DOTA
跟老齐学Python之用Python计算
2014/09/12 Python
在Python中实现贪婪排名算法的教程
2015/04/17 Python
Python使用getpass库读取密码的示例
2017/10/10 Python
使用python将大量数据导出到Excel中的小技巧分享
2018/06/14 Python
Python中dict和set的用法讲解
2019/03/28 Python
Python下opencv图像阈值处理的使用笔记
2019/08/04 Python
Python实现Keras搭建神经网络训练分类模型教程
2020/06/12 Python
英国123鲜花网站:123 Flowers
2019/07/07 全球购物
英国顶级足球鞋的领先零售商:Lovell Soccer
2019/08/27 全球购物
大学生自我鉴定范文
2013/12/28 职场文书
放飞理想演讲稿
2014/09/09 职场文书
物业项目经理岗位职责
2015/04/01 职场文书
2015年“世界无车日”活动方案
2015/05/06 职场文书
医者仁心观后感
2015/06/17 职场文书
Python中文纠错的简单实现
2021/07/07 Python
Vue提供的三种调试方式你知道吗
2022/01/18 Vue.js
“鬼灭之刃”热度不减,其成功背后的原因是什么?
2022/03/22 日漫