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实现的MongoDB数据库操作类分享
May 12 PHP
php中的curl_multi系列函数使用例子
Jul 29 PHP
php实现转换ubb代码的方法
Jun 18 PHP
WordPress中制作导航菜单的PHP核心方法讲解
Dec 11 PHP
php类中的$this,static,final,const,self这几个关键字使用方法
Dec 14 PHP
PHP内置加密函数详解
Nov 20 PHP
PHP在弹框中获取foreach中遍历的id值并传递给地址栏
Jun 13 PHP
PHP不使用内置函数实现字符串转整型的方法示例
Jul 03 PHP
ThinkPHP实现转换数据库查询结果数据到对应类型的方法
Nov 16 PHP
基于swoole实现多人聊天室
Jun 14 PHP
ThinkPHP5.1框架数据库链接和增删改查操作示例
Aug 03 PHP
PHP实现基本留言板功能原理与步骤详解
Mar 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面向对象全攻略 (十七) 自动加载类
2009/09/30 PHP
destoon网站转移服务器后搜索汉字出现乱码的解决方法
2014/06/21 PHP
PHP定时执行任务实现方法详解(Timer)
2015/07/30 PHP
THinkPHP获取客户端IP与IP地址查询的方法
2016/11/14 PHP
取选中的radio的值
2010/01/11 Javascript
js实现星星打分效果的方法
2020/07/05 Javascript
jQuery结合ajax实现动态加载文本内容
2015/05/19 Javascript
js实现浏览本地文件并显示扩展名的方法
2015/08/17 Javascript
JS实现淡蓝色简洁竖向Tab点击切换效果
2015/10/06 Javascript
js点击文本框后才加载验证码实例代码
2015/10/20 Javascript
你有必要知道的25个JavaScript面试题
2015/12/29 Javascript
jQuery动态生成表格及右键菜单功能示例
2017/01/13 Javascript
Angular.js中数组操作的方法教程
2017/07/31 Javascript
详解使用nvm管理多版本node的方法
2017/08/30 Javascript
JS设计模式之访问者模式定义与用法分析
2018/02/05 Javascript
jsonp跨域及实现百度首页联想功能的方法
2018/08/30 Javascript
node.js ws模块搭建websocket服务端的方法示例
2019/04/25 Javascript
使用React-Router实现前端路由鉴权的示例代码
2020/07/26 Javascript
解决vue prop传值default属性如何使用,为何不生效的问题
2020/09/21 Javascript
[51:53]DOTA2-DPC中国联赛 正赛 RNG vs Dragon BO3 第二场 1月24日
2021/03/11 DOTA
python实现数通设备端口监控示例
2014/04/02 Python
Python使用Supervisor来管理进程的方法
2015/05/28 Python
对TensorFlow中的variables_to_restore函数详解
2018/07/30 Python
python微元法计算函数曲线长度的方法
2018/11/08 Python
Python操作MySQL数据库的两种方式实例分析【pymysql和pandas】
2019/03/18 Python
Python 实现递归法解决迷宫问题的示例代码
2020/01/12 Python
踩坑:pytorch中eval模式下结果远差于train模式介绍
2020/06/23 Python
中国电子产品外贸网站:MiniIntheBox
2017/02/06 全球购物
马来西亚最好的婴儿商店:Motherhood
2017/09/14 全球购物
Gweniss格温妮丝女包官网:英国纯手工制造潮流包包品牌
2018/02/07 全球购物
Internet体系结构
2014/12/21 面试题
四川internet信息高速公路(C#)笔试题
2012/02/29 面试题
超市客服工作职责
2014/06/11 职场文书
2014年自愿离婚协议书
2014/10/10 职场文书
Python离线安装openpyxl模块的步骤
2021/03/30 Python
Spring中bean集合注入的方法详解
2022/07/07 Java/Android