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初学者最感迷茫的问题小结
Mar 27 PHP
PHP Global变量定义当前页面的全局变量实现探讨
Jun 05 PHP
ThinkPHP实现事务回滚示例代码
Jun 23 PHP
PHP网页游戏学习之Xnova(ogame)源码解读(三)
Jun 23 PHP
PHP获取短链接跳转后的真实地址和响应头信息的方法
Jul 25 PHP
一个图片地址分解程序(用于PHP小偷程序)
Aug 23 PHP
ecshop 2.72如何修改后台访问地址
Mar 03 PHP
PHP Opcache安装和配置方法介绍
May 28 PHP
PHP cURL初始化和执行方法入门级代码
May 28 PHP
PHP实现加密文本文件并限制特定页面的存取的效果
Oct 21 PHP
PHP实现动态创建XML文档的方法
Mar 30 PHP
laravel框架的安装与路由实例分析
Oct 11 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文件夹的创建与删除方法
2015/01/24 PHP
php数据访问之查询关键字
2016/05/09 PHP
PHP实现的简单异常处理类示例
2017/05/04 PHP
记Laravel调用Gin接口调用formData上传文件的实现方法
2019/12/12 PHP
cookie在javascript中的使用技巧以及隐私在服务器端的设置
2012/12/03 Javascript
JS实现判断滚动条滚到页面底部并执行事件的方法
2014/12/18 Javascript
js实现不提交表单获取单选按钮值的方法
2015/08/21 Javascript
详解nodejs微信公众号开发——1.接入微信公众号
2017/04/10 NodeJs
JS实现倒计时图文效果
2018/11/17 Javascript
vue实现的仿淘宝购物车功能详解
2019/01/27 Javascript
VUE+elementui面包屑实现动态路由详解
2019/11/04 Javascript
24行JavaScript代码实现Redux的方法实例
2019/11/17 Javascript
jQuery实现弹出层效果
2019/12/10 jQuery
基于javascript的无缝滚动动画1
2020/08/07 Javascript
bpython 功能强大的Python shell
2016/02/16 Python
python如何在列表、字典中筛选数据
2018/03/19 Python
Python3实现购物车功能
2018/04/18 Python
python的内存管理和垃圾回收机制详解
2019/05/18 Python
python argparser的具体使用
2019/11/10 Python
python标准库sys和OS的函数使用方法与实例详解
2020/02/12 Python
Python通过4种方式实现进程数据通信
2020/03/12 Python
使用 prometheus python 库编写自定义指标的方法(完整代码)
2020/06/29 Python
ubuntu16.04升级Python3.5到Python3.7的方法步骤
2020/08/20 Python
Python Selenium库的基本使用教程
2021/01/04 Python
SQL Server笔试题
2012/01/10 面试题
好的自荐信包括什么内容
2013/11/07 职场文书
舞蹈比赛获奖感言
2014/02/04 职场文书
小学数学课后反思
2014/04/23 职场文书
2014年计划生育协会工作总结
2014/11/14 职场文书
节水倡议书
2015/01/19 职场文书
2015庆祝七一建党节94周年活动总结
2015/03/20 职场文书
写作技巧:优秀文案必备的3种结构
2019/08/19 职场文书
OpenCV绘制圆端矩形的示例代码
2021/08/30 Python
Nginx配置之禁止指定IP访问
2022/05/02 Servers
JS函数式编程实现XDM一
2022/06/16 Javascript
Oracle数据库事务的开启与结束详解
2022/06/25 Oracle