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 相关文章推荐
使用sockets:从新闻组中获取文章(三)
Oct 09 PHP
smarty获得当前url的方法分享
Feb 14 PHP
PHP中Fatal error session_start()错误解决步骤
Aug 05 PHP
PHP和Shell实现检查SAMBA与NFS Server是否存在
Jan 07 PHP
php使用CURL伪造IP和来源实例详解
Jan 15 PHP
php中switch与ifelse的效率区别及适用情况分析
Feb 12 PHP
php通过递归方式复制目录和子目录的方法
Mar 13 PHP
php简单计算页面加载时间的方法
Jun 19 PHP
php通过淘宝API查询IP地址归属等信息
Dec 25 PHP
PHP编程实现阳历转换为阴历的方法实例
Aug 08 PHP
PHP集成环境XAMPP的安装与配置
Nov 13 PHP
PHP架构及原理知识点详解
Dec 22 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 数组遍历的差异(array_diff 的实现)
2008/03/23 PHP
php array_pop()数组函数将数组最后一个单元弹出(出栈)
2011/07/12 PHP
Server.HTMLEncode让代码在页面里显示为源代码
2013/12/08 PHP
举例详解PHP脚本的测试方法
2015/08/05 PHP
php生成mysql的数据字典
2016/07/07 PHP
PHP7常量数组用法分析
2016/09/26 PHP
How to Auto Include a Javascript File
2007/02/02 Javascript
JavaScript定义类或函数的几种方式小结
2011/01/09 Javascript
基于jquery的弹出提示框始终处于窗口的居中位置(类似于alert弹出框的效果)
2011/09/28 Javascript
页面调用单个swf文件,嵌套出多个方法。
2011/11/21 Javascript
thinkphp 表名 大小写 窍门
2015/02/01 Javascript
JS区分浏览器页面是刷新还是关闭
2016/04/17 Javascript
微信小程序实战之运维小项目
2017/01/17 Javascript
jQuery仿IOS弹出框插件
2017/02/18 Javascript
作为老司机使用 React 总结的 11 个经验教训
2017/04/08 Javascript
Angular.JS通过指令操作DOM的方法
2017/05/10 Javascript
Bootstrap与Angularjs的模态框实例代码
2017/08/03 Javascript
JS库之Three.js 简易入门教程(详解之一)
2017/09/13 Javascript
ES6基础之默认参数值
2019/02/21 Javascript
小程序实现短信登录倒计时
2019/07/12 Javascript
JavaScript进阶(一)变量声明提升实例分析
2020/05/09 Javascript
Vue.js获取手机系统型号、版本、浏览器类型的示例代码
2020/05/10 Javascript
Python 中Pickle库的使用详解
2018/02/24 Python
python对视频画框标记后保存的方法
2018/12/07 Python
Python 单例设计模式用法实例分析
2019/09/23 Python
Django之富文本(获取内容,设置内容方式)
2020/05/21 Python
Python 利用OpenCV给照片换底色的示例代码
2020/08/03 Python
Python+Xlwings 删除Excel的行和列
2020/12/19 Python
CSS3悬停效果案例应用
2012/11/21 HTML / CSS
html5版canvas自由拼图实例
2014/10/15 HTML / CSS
泰国健康和美容服务预订网站:GoWabi
2019/06/03 全球购物
新加坡最早生产电动滑板车的制造商之一:FunsToTheFore
2020/09/08 全球购物
纯净、自信、100%的羊绒服装:360Cashmere
2021/02/20 全球购物
计算机专业毕业生的自我评价
2013/11/18 职场文书
2015年元旦晚会活动总结(学生会)
2014/11/28 职场文书
2016八一建军节慰问信
2015/11/30 职场文书