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 相关文章推荐
echo(),print(),print_r()之间的区别?
Nov 19 PHP
NOD32 v2.70.32 简体中文封装版 提供下载了
Feb 27 PHP
PHP函数之error_reporting(E_ALL ^ E_NOTICE)详细说明
Jul 01 PHP
PHP下打开phpMyAdmin出现403错误的问题解决方法
May 23 PHP
探讨捕获php错误信息方法的详解
Jun 09 PHP
php文件服务实现虚拟挂载其他目录示例
Apr 17 PHP
Codeigniter生成Excel文档的简单方法
Jun 12 PHP
PHP实现视频文件上传完整实例
Aug 28 PHP
简单解决微信文章图片防盗链问题
Dec 17 PHP
php 使用curl模拟ip和来源进行访问的实现方法
May 02 PHP
详解PHP素材图片上传、下载功能
Apr 12 PHP
Laravel框架实现抢红包功能示例
Oct 31 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
PHP中set error handler函数用法小结
2015/11/11 PHP
windows 2008r2+php5.6.28环境搭建详细过程
2019/06/18 PHP
use jscript Create a SQL Server database
2007/06/16 Javascript
js动态在form上插入enctype=multipart/form-data的问题
2012/05/24 Javascript
关于JavaScript的面向对象和继承有利新手学习
2013/01/11 Javascript
jQuery中after的两种用法实例
2013/07/03 Javascript
jquery解析xml字符串简单示例
2014/04/11 Javascript
jquery实现的网页自动播放声音
2014/04/30 Javascript
js实时获取并显示当前时间的方法
2015/07/31 Javascript
jQuery实现鼠标选中文字后弹出提示窗口效果【附demo源码】
2016/09/05 Javascript
打造自己的jQuery插件入门教程
2016/09/23 Javascript
浅谈MVC+EF easyui dataGrid 动态加载分页表格
2016/11/10 Javascript
从零开始学习Node.js系列教程六:EventEmitter发送和接收事件的方法示例
2017/04/13 Javascript
Bootstrap 表单验证formValidation 实现远程验证功能
2017/05/17 Javascript
layui前段框架日期控件使用方法详解
2017/05/19 Javascript
js判断用户是输入的地址请求的路径(实例讲解)
2017/07/18 Javascript
Vue页面骨架屏注入方法
2018/05/13 Javascript
详解Vue源码学习之callHook钩子函数
2018/07/25 Javascript
关于layui导航栏不展示下拉列表的解决方法
2019/09/25 Javascript
构建大型 Vue.js 项目的10条建议(小结)
2019/11/14 Javascript
JS动态显示倒计时效果
2019/12/12 Javascript
微信小程序批量上传图片到七牛(推荐)
2019/12/19 Javascript
Vue项目如何引入bootstrap、elementUI、echarts
2020/11/26 Vue.js
[43:48]Ti4正赛第一天 VG vs NEWBEE 2
2014/07/19 DOTA
wxPython框架类和面板类的使用实例
2014/09/28 Python
python fabric使用笔记
2015/05/09 Python
利用Python如何生成便签图片详解
2018/07/09 Python
Django bulk_create()、update()与数据库事务的效率对比分析
2020/05/15 Python
安装python3.7编译器后如何正确安装opnecv的方法详解
2020/06/16 Python
python对输出的奇数偶数排序实例代码
2020/12/04 Python
selenium3.0+python之环境搭建的方法步骤
2021/02/01 Python
朗仕(Lab series)英国官网:雅诗兰黛集团男士专属护肤品牌
2017/11/28 全球购物
2015年万圣节活动总结
2015/03/24 职场文书
国情备忘录观后感
2015/06/04 职场文书
学校运动会感想
2015/08/10 职场文书
六一儿童节致辞稿(3篇)
2019/07/11 职场文书