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 相关文章推荐
discuz authcode 经典php加密解密函数解析
Jul 12 PHP
PHP实现今天是星期几的几种写法
Sep 26 PHP
在Debian系统下配置LNMP的教程
Jul 09 PHP
php使用APC实现实时上传进度条功能
Oct 26 PHP
Yii2超好用的日期和时间组件(值得收藏)
May 05 PHP
yii2 RBAC使用DbManager实现后台权限判断的方法
Jul 23 PHP
php中static 静态变量和普通变量的区别
Dec 01 PHP
PHP+Mysql无刷新问答评论系统(源码)
Dec 20 PHP
PHP中的日期时间处理利器实例(Carbon)
Jun 09 PHP
Laravel jwt 多表(多用户端)验证隔离的实现
Dec 18 PHP
关于PHP5.6+版本“No input file specified”问题的解决
Dec 11 PHP
JS中彻底删除JSON对象组成的数组中的元素
Sep 22 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
PHP Session_Regenerate_ID函数双释放内存破坏漏洞
2011/01/27 PHP
yii框架表单模型使用及以数组形式提交表单数据示例
2014/04/30 PHP
php使用google地图应用实例
2014/12/31 PHP
php生成与读取excel文件
2016/10/14 PHP
php的socket编程详解
2016/11/20 PHP
Nigma vs AM BO3 第一场2.13
2021/03/10 DOTA
jquery+json 通用三级联动下拉列表
2010/04/19 Javascript
js 创建快捷方式的代码(fso)
2010/11/19 Javascript
初窥JQuery(一)jquery选择符 必备知识点
2010/11/25 Javascript
解决javascript:window.close()在chrome,Firefox下失效的问题
2013/05/07 Javascript
jquery重复提交请求的原因浅析
2014/05/23 Javascript
教你如何使用firebug调试功能了解javascript闭包和this
2015/03/04 Javascript
jQuery Validation Plugin验证插件手动验证
2016/01/26 Javascript
BootStrap中jQuery插件Carousel实现轮播广告效果
2017/03/27 jQuery
jQuery回调方法使用示例
2017/06/26 jQuery
JQuery 又谈ajax局部刷新
2017/11/27 jQuery
json前后端数据交互相关代码
2018/09/19 Javascript
element el-input directive数字进行控制
2018/10/11 Javascript
vuejs+element UI点击编辑表格某一行时获取内容填入表单的示例
2018/10/31 Javascript
[00:44]2016完美“圣”典 风云人物:Mikasa宣传片
2016/12/07 DOTA
python搜索指定目录的方法
2015/04/29 Python
python样条插值的实现代码
2018/12/17 Python
python基础教程之while循环
2019/08/14 Python
Python 面向对象之类class和对象基本用法示例
2020/02/02 Python
Python在终端通过pip安装好包以后在Pycharm中依然无法使用的问题(三种解决方案)
2020/03/10 Python
Python带参数的装饰器运行原理解析
2020/06/09 Python
法律专业应届生自荐信范文
2014/01/06 职场文书
团日活动策划书
2014/02/01 职场文书
企业宣传策划方案
2014/05/29 职场文书
疾病防治方案
2014/05/31 职场文书
欢迎词范文
2015/01/27 职场文书
会计简历自我评价
2015/03/10 职场文书
一篇合格的广告文案,其主要目的是什么?
2019/07/12 职场文书
诗词赏析-(浣溪沙)
2019/08/13 职场文书
导游词之山东八大关
2019/12/18 职场文书
go语言中http超时引发的事故解决
2021/06/02 Golang