PHP的反射机制实例详解


Posted in PHP onMarch 29, 2017

本文实例讲述了PHP的反射机制。分享给大家供大家参考,具体如下:

介绍:

PHP5添加了一项新的功能:Reflection。这个功能使得phper可以reverse-engineer class, interface,function,method and extension。通过PHP代码,就可以得到某object的所有信息,并且可以和它交互。

反射是什么?

它是指在PHP运行状态中,扩展分析PHP程序,导出或提取出关于类、方法、属性、参数等的详细信息,包括注释。这种动态获取的信息以及动态调用对象的方法的功能称为反射API。反射是操纵面向对象范型中元模型的API,其功能十分强大,可帮助我们构建复杂,可扩展的应用。

其用途如:自动加载插件,自动生成文档,甚至可用来扩充PHP语言。

php反射api由若干类组成,可帮助我们用来访问程序的元数据或者同相关的注释交互。借助反射我们可以获取诸如类实现了那些方法,创建一个类的实例(不同于用new创建),调用一个方法(也不同于常规调用),传递参数,动态调用类的静态方法。

反射api是php内建的oop技术扩展,包括一些类,异常和接口,综合使用他们可用来帮助我们分析其它类,接口,方法,属性,方法和扩展。这些oop扩展被称为反射。

通过ReflectionClass,我们可以得到Person类的以下信息:

1)常量 Contants
2)属性 Property Names
3)方法 Method Names静态
4)属性 Static Properties
5)命名空间 Namespace
6)Person类是否为final或者abstract

例子

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;
    }
}

接下来反射它,只要把类名"Person"传递给ReflectionClass就可以了:

$class = new ReflectionClass('Person');//建立 Person这个类的反射类
$instance = $class->newInstanceArgs($args);//相当于实例化Person 类

1)获取属性(Properties):

$properties = $class->getProperties();
foreach($properties as $property) {
  echo $property->getName()."\n";
}
// 输出:
// _allowDynamicAttributes
// id
// name
// biography

默认情况下,ReflectionClass会获取到所有的属性,private 和 protected的也可以。如果只想获取到private属性,就要额外传个参数:

$private_properties = $class->getProperties(ReflectionProperty::IS_PRIVATE);

可用参数列表:

ReflectionProperty::IS_STATIC
ReflectionProperty::IS_PUBLIC
ReflectionProperty::IS_PROTECTED
ReflectionProperty::IS_PRIVATE

如果要同时获取public 和private 属性,就这样写:ReflectionProperty::IS_PUBLIC | ReflectionProperty::IS_PROTECTED。

通过$property->getName()可以得到属性名。

2)获取注释:

通过getDocComment可以得到写给property的注释。

foreach($properties as $property) {
  if($property->isProtected()) {
    $docblock = $property->getDocComment();
    preg_match('/ type\=([a-z_]*) /', $property->getDocComment(), $matches);
    echo $matches[1]."\n";
  }
}
// Output:
// primary_autoincrement
// varchar
// text

3)获取类的方法

获取方法(methods):通过getMethods() 来获取到类的所有methods。

4)执行类的方法:

$instance->getBiography(); //执行Person 里的方法getBiography
//或者:
$ec=$class->getmethod('getName'); //获取Person 类中的getName方法
$ec->invoke($instance);    //执行getName 方法

希望本文所述对大家PHP程序设计有所帮助。

PHP 相关文章推荐
用PHP实现多级树型菜单
Oct 09 PHP
PHP 函数执行效率的小比较
Oct 17 PHP
PHP中的session永不过期的解决思路及实现方法分享
Apr 20 PHP
PHP中使用foreach和引用导致程序BUG的问题介绍
Sep 05 PHP
一些php项目中比较通用的php自建函数的详解
Jun 06 PHP
改写函数实现PHP二维/三维数组转字符串
Sep 13 PHP
PHP语法自动检查的Vim插件
Aug 11 PHP
php静态文件生成类实例分析
Jan 03 PHP
CI框架实现框架前后端分离的方法详解
Dec 30 PHP
php中照片旋转 (orientation) 问题的正确处理
Feb 16 PHP
laravel 5.3中自定义加密服务的方案详解
May 09 PHP
详解PHP用mb_string处理windows中文字符
May 26 PHP
php面向对象之反射功能与用法分析
Mar 29 #PHP
PHP命名空间namespace的定义方法详解
Mar 29 #PHP
php mysql_list_dbs()函数用法示例
Mar 29 #PHP
php json相关函数用法示例
Mar 28 #PHP
php使用PDO下exec()函数查询执行后受影响行数的方法
Mar 28 #PHP
php事务回滚简单实现方法示例
Mar 28 #PHP
php中bind_param()函数用法分析
Mar 28 #PHP
You might like
不用数据库的多用户文件自由上传投票系统(3)
2006/10/09 PHP
使用php将某个目录下面的所有文件罗列出来的方法详解
2013/06/21 PHP
PHP整合七牛实现上传文件
2015/07/03 PHP
PHP简单的MVC框架实现方法
2015/12/01 PHP
javascript下阻止表单重复提交、防刷新、防后退
2007/08/17 Javascript
ie 调试javascript的工具
2009/04/29 Javascript
JavaScript 常用函数库详解
2009/10/21 Javascript
在JavaScript中使用对数Math.log()方法的教程
2015/06/15 Javascript
简述JavaScript对传统文档对象模型的支持
2015/06/16 Javascript
纯JavaScript实现的分页插件实例
2015/07/14 Javascript
jQuery实现图片左右滚动特效
2020/04/20 Javascript
jquery实现的用户注册表单提示操作效果代码分享
2015/08/28 Javascript
基于JS实现二维码图片固定在右下角某处并跟随滚动条滚动
2017/02/08 Javascript
微信小程序中做用户登录与登录态维护的实现详解
2017/05/17 Javascript
Node.js+jade+mongodb+mongoose实现爬虫分离入库与生成静态文件的方法
2017/09/20 Javascript
详解JavaScript基础知识(JSON、Function对象、原型、引用类型)
2018/01/16 Javascript
基于mpvue搭建微信小程序项目框架的教程详解
2019/04/10 Javascript
javascript随机变色实例代码
2019/10/15 Javascript
vue - vue.config.js中devServer配置方式
2019/10/30 Javascript
详解vue中$nextTick和$forceUpdate的用法
2019/12/11 Javascript
Python实现获取操作系统版本信息方法
2015/04/08 Python
Python实现在matplotlib中两个坐标轴之间画一条直线光标的方法
2015/05/20 Python
Python探索之静态方法和类方法的区别详解
2017/10/27 Python
python获取酷狗音乐top500的下载地址 MP3格式
2018/04/17 Python
Django项目中用JS实现加载子页面并传值的方法
2018/05/28 Python
python贪吃蛇游戏代码
2020/04/18 Python
对django layer弹窗组件的使用详解
2019/08/31 Python
CSS3的calc()做响应模式布局的实现方法
2017/09/06 HTML / CSS
适用于所有创业者的创业计划书
2014/02/05 职场文书
投资协议书范本
2014/04/21 职场文书
冬季施工防火方案
2014/05/17 职场文书
三严三实对照检查材料范文
2014/09/23 职场文书
Django+Celery实现定时任务的示例
2021/06/23 Python
SpringBoot+VUE实现数据表格的实战
2021/08/02 Java/Android
vue判断按钮是否可以点击
2022/04/09 Vue.js
SQL Server Agent 服务无法启动
2022/04/20 SQL Server