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 IP及IP段进行访问限制的代码
Dec 17 PHP
Windows IIS PHP 5.2 安装与配置方法
Jun 08 PHP
防止本地用户用fsockopen DDOS攻击对策
Nov 02 PHP
php列出一个目录下的所有文件的代码
Oct 09 PHP
PHP中session变量的销毁
Feb 27 PHP
php中实现可以返回多个值的函数实例
Mar 21 PHP
php外部执行命令函数用法小结
Oct 11 PHP
PHP编程实现脚本异步执行的方法
Aug 09 PHP
PHP设计模式之观察者模式定义与用法示例
Aug 04 PHP
PHP实现负载均衡的加权轮询方法分析
Aug 22 PHP
Laravel框架控制器,视图及模型操作图文详解
Dec 04 PHP
Laravel5.1 框架Request请求操作常见用法实例分析
Jan 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
php的laravel框架快速集成微信登录的方法
2016/12/12 PHP
laravel框架实现为 Blade 模板引擎添加新文件扩展名操作示例
2020/01/25 PHP
web 页面分页打印的实现
2009/06/22 Javascript
picChange 图片切换特效的函数代码
2010/05/06 Javascript
如何使用jquery实现文字上下滚动效果
2016/10/12 Javascript
bootstrapValidator 重新启用提交按钮的方法
2017/02/20 Javascript
Vue.js展示AJAX数据简单示例讲解
2017/03/29 Javascript
微信小程序中使用javascript 回调函数
2017/05/11 Javascript
AngularJs 终极购物车(实例讲解)
2017/11/08 Javascript
解决vue中对象属性改变视图不更新的问题
2018/02/23 Javascript
浅析js中mvvm模式实现的原理
2018/10/06 Javascript
微信小程序获取用户绑定手机号方法示例
2019/07/21 Javascript
Python 可爱的大小写
2008/09/06 Python
Python查找相似单词的方法
2015/03/05 Python
python 回调函数和回调方法的实现分析
2016/03/23 Python
numpy自动生成数组详解
2017/12/15 Python
python实现百万答题自动百度搜索答案
2018/01/16 Python
Python统计一个字符串中每个字符出现了多少次的方法【字符串转换为列表再统计】
2019/05/05 Python
Python基于scipy实现信号滤波功能
2019/05/08 Python
wxPython实现文本框基础组件
2019/11/18 Python
pyecharts动态轨迹图的实现示例
2020/04/17 Python
Django数据模型中on_delete使用详解
2020/11/30 Python
python爬取抖音视频的实例分析
2021/01/19 Python
html5使用html2canvas实现浏览器截图的示例
2017/08/31 HTML / CSS
菲律宾票务网站:StubHub菲律宾
2018/04/21 全球购物
荷兰和比利时时尚鞋店:Van Dalen
2018/04/23 全球购物
阿联酋航空丹麦官方网站:Emirates DK
2019/08/25 全球购物
求网格中的黑点分布
2013/11/06 面试题
农村婚礼证婚词
2014/01/10 职场文书
新闻人物通讯稿
2014/10/09 职场文书
项目负责人岗位职责
2015/02/15 职场文书
离婚案件原告代理词
2015/05/23 职场文书
女性健康知识讲座主持词
2015/07/04 职场文书
mysql在项目中怎么选事务隔离级别
2021/05/25 MySQL
golang为什么要统一错误处理
2022/04/03 Golang
MySQL 数据表操作
2022/05/04 MySQL