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 相关文章推荐
php5数字型字符串加解密代码
Apr 24 PHP
探讨多键值cookie(php中cookie存取数组)的详解
Jun 06 PHP
php中hashtable实现示例分享
Feb 13 PHP
php二维数组转成字符串示例
Feb 17 PHP
PHP FTP操作类代码( 上传、拷贝、移动、删除文件/创建目录)
May 10 PHP
PHP自定义函数实现格式化秒的方法
Sep 14 PHP
手把手编写PHP框架 深入了解MVC运行流程
Sep 19 PHP
使用Zttp简化Guzzle 调用
Jul 02 PHP
PHP实现的各类hash算法长度及性能测试实例
Aug 27 PHP
PHP实现一个轻量级容器的方法
Jan 28 PHP
laravel 实现关闭CSRF(全部关闭、部分关闭)
Oct 21 PHP
laravel框架中控制器的创建和使用方法分析
Nov 23 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
Session的工作方式
2006/10/09 PHP
PHP 5.3 下载时 VC9、VC6、Thread Safe、Non Thread Safe的区别分析
2011/03/28 PHP
详解WordPress中调用评论模板和循环输出评论的PHP函数
2016/01/05 PHP
YII Framework框架教程之国际化实现方法
2016/03/14 PHP
Laravel框架模板继承操作示例
2018/06/11 PHP
Laravel框架定时任务2种实现方式示例
2018/12/08 PHP
window.location.reload()方法刷新页面弹出要再次显示该网页对话框
2013/04/24 Javascript
jquery监听div内容的变化具体实现思路
2013/11/04 Javascript
JS代码实现table数据分页效果
2016/05/26 Javascript
jQuery中弹出iframe内嵌页面元素到父页面并全屏化的实例代码
2016/12/27 Javascript
使用jquery判断一个元素是否含有一个指定的类(class)实例
2017/02/12 Javascript
React Native开发封装Toast与加载Loading组件示例
2018/09/08 Javascript
javascript删除数组元素的七个方法示例
2019/09/09 Javascript
layui导出所有数据的例子
2019/09/10 Javascript
vue使用recorder.js实现录音功能
2019/11/22 Javascript
[34:10]Secret vs VG 2019国际邀请赛淘汰赛 败者组 BO3 第二场 8.24
2019/09/10 DOTA
[31:55]完美世界DOTA2联赛循环赛 IO vs GXR BO2第一场 11.04
2020/11/05 DOTA
python多线程操作实例
2014/11/21 Python
python sort、sorted高级排序技巧
2014/11/21 Python
Python Web框架Flask信号机制(signals)介绍
2015/01/01 Python
Python单链表简单实现代码
2016/04/27 Python
在Python的一段程序中如何使用多次事件循环详解
2017/09/07 Python
python实现飞机大战微信小游戏
2020/03/21 Python
python常用库之NumPy和sklearn入门
2019/07/11 Python
python如何获取apk的packagename和activity
2020/01/10 Python
班组长的岗位职责
2013/12/09 职场文书
教师远程培训感言
2014/03/06 职场文书
手机银行营销方案
2014/03/14 职场文书
药学职务聘任书
2014/03/29 职场文书
《大自然的语言》教学反思
2014/04/08 职场文书
优秀党员事迹材料
2014/12/18 职场文书
python基于opencv批量生成验证码的示例
2021/04/28 Python
总结Pyinstaller打包的高级用法
2021/06/28 Python
css布局巧妙技巧之css三角示例的运用
2022/03/16 HTML / CSS
MySQL transaction事务安全示例讲解
2022/06/21 MySQL
python数据分析之单因素分析线性拟合及地理编码
2022/06/25 Python