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中的串行化变量和序列化对象
Sep 05 PHP
一个简单的自动发送邮件系统(一)
Oct 09 PHP
php 学习资料零碎东西
Dec 04 PHP
php中Smarty模板初体验
Aug 08 PHP
PHP session会话的安全性分析
Sep 08 PHP
提高PHP性能的编码技巧以及性能优化详细解析
Aug 24 PHP
PHP set_error_handler()函数使用详解(示例)
Nov 12 PHP
php之curl实现http与https请求的方法
Oct 21 PHP
PHP使用ODBC连接数据库的方法
Jul 18 PHP
php生成静态html页面的方法(2种方法)
Sep 14 PHP
php简单创建zip压缩文件的方法
Apr 30 PHP
php简单随机字符串生成方法示例
Apr 19 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的日期与时间函数技巧
2008/04/24 PHP
phpMyAdmin 安装配置方法和问题解决
2009/06/08 PHP
php 连接mysql连接被重置的解决方法
2011/02/15 PHP
laravel 实现关闭CSRF(全部关闭、部分关闭)
2019/10/21 PHP
css把超出的部分显示为省略号的方法兼容火狐
2008/07/23 Javascript
jQuery选择器全面总结
2014/01/06 Javascript
JS实现从连接中获取youtube的key实例
2015/07/02 Javascript
AngularJS实现元素显示和隐藏的几个案例
2015/12/09 Javascript
jquery.validate使用详解
2016/06/02 Javascript
JS使用eval()动态创建变量的方法
2016/06/03 Javascript
JQuery学习总结【二】
2016/12/01 Javascript
jQuery实现html table行Tr的复制、删除、计算功能
2017/07/10 jQuery
详解react服务端渲染(同构)的方法
2017/09/21 Javascript
通过vue-cli来学习修改Webpack多环境配置和发布问题
2017/12/22 Javascript
ionic2中使用自动生成器的方法
2018/03/04 Javascript
JS使用正则表达式获取小括号、中括号及花括号内容的方法示例
2018/06/01 Javascript
浅谈微信小程序之官方UI框架we-ui使用教程
2018/08/20 Javascript
Node.js如何优雅的封装一个实用函数的npm包的方法
2019/04/29 Javascript
vue 解决路由只变化参数页面组件不更新问题
2019/11/05 Javascript
javascript设计模式 ? 访问者模式原理与用法实例分析
2020/04/26 Javascript
Element Cascader 级联选择器的使用示例
2020/07/27 Javascript
python实现查找excel里某一列重复数据并且剔除后打印的方法
2015/05/26 Python
详解Python中的变量及其命名和打印
2016/03/11 Python
python魔法方法-自定义序列详解
2016/07/21 Python
Python处理Excel文件实例代码
2017/06/20 Python
Python中的并发处理之asyncio包使用的详解
2018/04/03 Python
详解html2canvas截图不能截取圆角图片的解决方案
2018/01/30 HTML / CSS
Parfumdreams英国:香水和化妆品
2019/05/10 全球购物
新媒传信软件测试面试题
2013/02/24 面试题
多媒体专业自我鉴定
2014/02/28 职场文书
学生请假条格式
2014/04/11 职场文书
政府绩效管理实施方案
2014/05/04 职场文书
2019年亲子运动会口号
2019/10/11 职场文书
导游词之上海杜莎夫人蜡像馆
2019/11/22 职场文书
详解python网络进程
2021/06/15 Python
Python学习之包与模块详解
2022/03/19 Python