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 来访国内外IP判断代码并实现页面跳转
Dec 18 PHP
phpmyadmin 常用选项设置详解版
Mar 07 PHP
php select,radio和checkbox默认选择的实现方法
May 15 PHP
PHP类中Static方法效率测试代码
Oct 17 PHP
PHP递归算法的详细示例分析
Feb 19 PHP
PHP将两个关联数组合并函数提高函数效率
Mar 18 PHP
thinkphp验证码显示不出来的解决方法
Mar 29 PHP
PHPMailer发送HTML内容、带附件的邮件实例
Jul 01 PHP
PHP中的流(streams)浅析
Jul 02 PHP
php使用get_class_methods()函数获取分类的方法
Jul 20 PHP
thinkPHP5.0框架引入Traits功能实例分析
Mar 18 PHP
PHP两个n位的二进制整数相加问题的解决
Aug 26 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中iconv函数知识汇总
2015/07/02 PHP
PHP中strncmp()函数比较两个字符串前2个字符是否相等的方法
2016/01/07 PHP
php版微信自动登录并获取昵称的方法
2016/09/23 PHP
使用composer 安装 laravel框架的方法图文详解
2019/08/02 PHP
一款js和css代码压缩工具[附JAVA环境配置方法]
2010/04/16 Javascript
JSCode all of Brower 全局屏蔽网页右键功能 具体实现
2013/06/05 Javascript
js调试系列 断点与动态调试[基础篇]
2014/06/18 Javascript
jQuery实现倒计时按钮功能代码分享
2014/09/03 Javascript
jQuery中die()方法用法实例
2015/01/19 Javascript
js前端实现图片懒加载(lazyload)的两种方式
2017/04/24 Javascript
在vscode里使用.vue代码模板的方法
2018/04/28 Javascript
js实现简单选项卡功能
2020/03/23 Javascript
node 标准输入流和输出流代码实例
2019/09/19 Javascript
design vue 表格开启列排序的操作
2020/10/28 Javascript
用Python的Flask框架结合MySQL写一个内存监控程序
2015/11/07 Python
pygame游戏之旅 添加键盘按键的方法
2018/11/20 Python
Python爬虫实现爬取百度百科词条功能实例
2019/04/05 Python
python 在某.py文件中调用其他.py内的函数的方法
2019/06/25 Python
详解Python利用random生成一个列表内的随机数
2019/08/21 Python
python 计算两个列表的相关系数的实现
2019/08/29 Python
利用 Python ElementTree 生成 xml的实例
2020/03/06 Python
Python 制作查询商品历史价格的小工具
2020/10/20 Python
Python实现异步IO的示例
2020/11/05 Python
Python性能测试工具Locust安装及使用
2020/12/01 Python
python 模块导入问题汇总
2021/02/01 Python
Urban Outfitters英国官网:美国平价服饰品牌
2016/11/25 全球购物
质量工程师岗位职责
2013/11/16 职场文书
教育学专业毕业生的自我鉴定
2013/11/26 职场文书
致共产党员倡议书
2014/04/16 职场文书
机关驾驶员违规检讨书
2014/09/13 职场文书
小学四年级学生评语
2014/12/26 职场文书
酒店财务总监岗位职责
2015/04/03 职场文书
安全伴我行主题班会
2015/08/13 职场文书
解除租赁合同协议书
2016/03/21 职场文书
公司年会晚会开幕词
2019/04/02 职场文书
学生会自荐信
2019/05/16 职场文书