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中使用unset销毁变量并内存释放问题
Jul 05 PHP
深入php list()函数的详解
Jun 05 PHP
PHP 实现explort() 功能的详解
Jun 20 PHP
检查用户名是否已在mysql中存在的php写法
Jan 20 PHP
如何让thinkphp在模型中自动完成session赋值小教程
Sep 05 PHP
PHP 读取和编写 XML
Nov 19 PHP
php实现爬取和分析知乎用户数据
Jan 26 PHP
Yii视图CGridView列表用法实例分析
Jul 12 PHP
PHP的AES加密算法完整实例
Jul 20 PHP
thinkPHP框架实现多表查询的方法
Jun 14 PHP
php 自定义函数实现将数据 以excel 表格形式导出示例
Nov 13 PHP
PHP实现简易用户登录系统
Jul 10 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遍历数组的方法汇总分析
2013/06/08 PHP
Js获取事件对象代码
2010/08/05 Javascript
用JQuery调用Session的实现代码
2010/10/29 Javascript
jQuery动态添加的元素绑定事件处理函数代码
2011/08/02 Javascript
一个关于javascript匿名函数的问题分析
2012/03/30 Javascript
javascript实现校验文件上传控件实例
2015/04/20 Javascript
jquery插件validation实现验证身份证号等
2015/06/04 Javascript
javascript格式化日期时间方法汇总
2015/06/19 Javascript
JavaScript代码因逗号不规范导致IE不兼容的问题
2016/02/25 Javascript
jQuery下拉框的简单应用
2016/06/24 Javascript
jQuery ajax MD5实现用户注册即时验证功能
2016/10/11 Javascript
JavaScript实现替换字符串中最后一个字符的方法
2017/03/07 Javascript
vue实现学生录入系统之添加删除功能
2018/07/11 Javascript
JS函数本身的作用域实例分析
2020/03/16 Javascript
[56:48]FNATIC vs EG 2019国际邀请赛小组赛 BO2 第二场 8.15
2019/08/16 DOTA
python使用datetime模块计算各种时间间隔的方法
2015/03/24 Python
Python查找两个有序列表中位数的方法【基于归并算法】
2018/04/20 Python
python实现简易内存监控
2018/06/21 Python
Django实现表单验证
2018/09/08 Python
python3 property装饰器实现原理与用法示例
2019/05/15 Python
python 判断三个数字中的最大值实例代码
2019/07/24 Python
解决keras使用cov1D函数的输入问题
2020/06/29 Python
PyCharm Community安装与配置的详细教程
2020/11/24 Python
HTML5之SVG 2D入门12—SVG DOM及DOM操作介绍
2013/01/30 HTML / CSS
Bose法国官网:购买耳机、扬声器、家庭影院、专业音响
2017/12/21 全球购物
程序员跳槽必看面试题总结
2013/06/28 面试题
大队干部竞选演讲稿
2014/04/28 职场文书
安全生产月活动总结
2014/05/04 职场文书
联谊活动总结
2014/08/28 职场文书
干部考察材料范文
2014/12/24 职场文书
职代会闭幕词
2015/01/28 职场文书
2015年检验科工作总结
2015/04/27 职场文书
车辆管理制度范本
2015/08/05 职场文书
laravel添加角色和模糊搜索功能的实现代码
2021/06/22 PHP
使用kubeadm命令行工具创建kubernetes集群
2022/03/31 Servers
SQL Server数据库备份和恢复数据库的全过程
2022/06/14 SQL Server