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+MSSQL分页的例子
Oct 09 PHP
PHP+DBM的同学录程序(2)
Oct 09 PHP
php时间不正确的解决方法
Apr 09 PHP
php 读取文件乱码问题
Feb 20 PHP
php function用法如何递归及return和echo区别
Mar 07 PHP
php获取表单中多个同名input元素的值
Mar 20 PHP
php基于jquery的ajax技术传递json数据简单实例
Apr 15 PHP
简单理解PHP的面向对象编程方式
May 17 PHP
PHP jQuery+Ajax结合写批量删除功能
May 19 PHP
PHP机器学习库php-ml的简单测试和使用方法
Jul 14 PHP
PHP实现验证码校验功能
Nov 16 PHP
TP5框架实现一次选择多张图片并预览的方法示例
Apr 04 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
xml+php动态载入与分页
2006/10/09 PHP
使用PHPMYADMIN操作mysql数据库添加新用户和数据库的方法
2010/04/02 PHP
[原创]ThinkPHP让../Public在模板不解析(直接输出)的方法
2015/10/09 PHP
PHP fopen函数用法实例讲解
2019/02/15 PHP
php文件操作之文件写入字符串、数组的方法分析
2019/04/15 PHP
PHP中isset、empty的用法与区别示例详解
2020/11/05 PHP
javascript &amp;&amp;和||运算法的另类使用技巧
2009/11/28 Javascript
修改好的jquery滚动字幕效果实现代码
2011/06/22 Javascript
JS实现可改变列宽的table实例
2013/07/02 Javascript
使用jQuery实现的掷色子游戏动画效果
2014/03/14 Javascript
javascript的propertyIsEnumerable()方法使用介绍
2014/04/09 Javascript
js delete 用法(删除对象属性及变量)
2014/08/24 Javascript
JS实现跟随鼠标闪烁转动色块的方法
2015/02/26 Javascript
js实现点击向下展开的下拉菜单效果代码
2015/09/01 Javascript
JS将滑动门改为选项卡(需鼠标点击)的实现方法
2015/09/27 Javascript
JS实现的页面自定义滚动条效果
2015/10/26 Javascript
jQuery插件AjaxFileUpload实现ajax文件上传
2016/05/05 Javascript
基于BootStrap Metronic开发框架经验小结【四】Bootstrap图标的提取和利用
2016/05/12 Javascript
JavaScript初学者必看“new”
2017/06/12 Javascript
package.json文件配置详解
2017/06/15 Javascript
原生JS进行前后端同构
2018/04/22 Javascript
uni-app如何实现增量更新功能
2020/01/03 Javascript
[04:46]2018年度玩家喜爱的电竞媒体-完美盛典
2018/12/16 DOTA
Python随机生成数据后插入到PostgreSQL
2016/07/28 Python
在Pycharm中将pyinstaller加入External Tools的方法
2019/01/16 Python
Python列表常见操作详解(获取,增加,删除,修改,排序等)
2019/02/18 Python
python二进制文件的转译详解
2019/07/03 Python
python实现输入的数据在地图上生成热力图效果
2019/12/06 Python
HTML5 File API改善网页上传功能
2009/08/19 HTML / CSS
加拿大建筑和装修专家:Reno-Depot
2017/12/21 全球购物
如何手工释放资源
2013/12/15 面试题
酒店办公室文员岗位职责
2013/12/18 职场文书
新闻稿件写作技巧
2015/07/18 职场文书
中学校园广播稿
2015/08/18 职场文书
nginx 防盗链防爬虫配置详解
2021/03/31 Servers
mysql获取指定时间段中所有日期或月份的语句(不设存储过程,不加表)
2021/06/18 MySQL