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 相关文章推荐
利用文件属性结合Session实现在线人数统计
Oct 09 PHP
来自PHP.NET的入门教程
Oct 09 PHP
IIS6+PHP5+MySQL5+Zend Optimizer+phpMyAdmin安装配置图文教程 2009年
Jun 08 PHP
基于PHP一些十分严重的缺陷详解
Jun 03 PHP
PHP输出当前进程所有变量/常量/模块/函数/类的示例
Nov 07 PHP
PHP文件大小格式化函数合集
Mar 10 PHP
JavaScript创建命名空间的5种写法
Jun 24 PHP
PHP用FTP类上传文件视频等的简单实现方法
Sep 23 PHP
PHP获取当前日期及本周一是几月几号的方法
Mar 28 PHP
PHP中in_array的隐式转换的解决方法
Mar 06 PHP
PHP基于openssl实现的非对称加密操作示例
Jan 11 PHP
YII框架关联查询操作示例
Apr 29 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
使用TinyButStrong模板引擎来做WEB开发
2007/03/16 PHP
动易数据转成dedecms的php程序
2007/04/07 PHP
php面向对象全攻略 (十五) 多态的应用
2009/09/30 PHP
PHP 配置open_basedir 让各虚拟站点独立运行
2009/11/12 PHP
php运行出现Call to undefined function curl_init()的解决方法
2010/11/02 PHP
php通过两层过滤获取留言内容的方法
2016/07/11 PHP
用JS操作FRAME中的IFRAME及其内容的实现代码
2008/07/26 Javascript
js Array对象的扩展函数代码
2013/04/24 Javascript
jquery 字符串切割函数substring的用法说明
2014/02/11 Javascript
简介JavaScript中的setTime()方法的使用
2015/06/11 Javascript
AngularJs expression详解及简单示例
2016/09/01 Javascript
Angular学习笔记之angular的$filter服务浅析
2016/11/12 Javascript
无阻塞加载js,防止因js加载不了影响页面显示的问题
2016/12/18 Javascript
JavaScript中常见的八个陷阱总结
2017/06/28 Javascript
详解JS模块导入导出
2017/12/20 Javascript
一个Vue视频媒体多段裁剪组件的实现示例
2018/08/09 Javascript
jQuery子选择器与可见性选择器实例分析
2019/06/28 jQuery
Element ui 下拉多选时新增一个选择所有的选项
2019/08/21 Javascript
微信小程序使用蓝牙小插件
2019/09/23 Javascript
JS实现电脑虚拟键盘的操作
2020/06/24 Javascript
微信小程序地图实现展示线路
2020/07/29 Javascript
Vue单文件组件开发实现过程详解
2020/07/30 Javascript
[38:44]DOTA2上海特级锦标赛A组小组赛#2 Secret VS CDEC第二局
2016/02/25 DOTA
下载糗事百科的内容_python版
2008/12/07 Python
Python 中 Meta Classes详解
2016/02/13 Python
python开发之str.format()用法实例分析
2016/02/22 Python
python中安装模块包版本冲突问题的解决
2017/05/02 Python
Python实现拷贝/删除文件夹的方法详解
2018/08/29 Python
python连接、操作mongodb数据库的方法实例详解
2019/09/11 Python
pytorch使用horovod多gpu训练的实现
2020/09/09 Python
物业客服专员岗位职责
2013/11/30 职场文书
简历中的自我评价范文
2014/02/05 职场文书
护士的自我鉴定
2014/02/07 职场文书
合法的离婚协议书范本
2014/10/23 职场文书
动画「进击的巨人」第86话播出感谢绘公开
2022/03/21 日漫
ubuntu下常用apt命令介绍
2022/06/05 Servers