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 相关文章推荐
linux下为php添加curl扩展的方法
Jul 29 PHP
基于Zend的Captcha机制的应用
May 02 PHP
深入解析PHP垃圾回收机制对内存泄露的处理
Jun 14 PHP
Yii不依赖Model的表单生成器用法实例
Dec 04 PHP
php实现的农历算法实例
Aug 11 PHP
老生常谈PHP面向对象之命令模式(必看篇)
May 24 PHP
Laravel 5.4重新登录实现跳转到登录前页面的原理和方法
Jul 13 PHP
PHP实现的基于单向链表解决约瑟夫环问题示例
Sep 30 PHP
PHP测试框架PHPUnit组织测试操作示例
May 28 PHP
php实现的rc4加密解密类定义与用法示例
Aug 16 PHP
php array_chunk()函数用法与注意事项
Jul 12 PHP
Laravel5.1 框架响应基本用法实例分析
Jan 04 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 file_get_contents函数轻松采集html数据
2010/04/22 PHP
兼容性比较好的PHP生成缩略图的代码
2011/01/12 PHP
PHP+jquery+ajax实现即时聊天功能实例
2014/12/23 PHP
javascript CSS画图之基础篇
2009/07/29 Javascript
测试你的JS的掌握程度的代码
2009/12/09 Javascript
基于jquery的图片懒加载js
2010/06/30 Javascript
原生js和jQuery写的网页选项卡特效对比
2015/04/27 Javascript
jQuery判断一个元素是否可见的方法
2015/06/05 Javascript
jQuery插件ImageDrawer.js实现动态绘制图片动画(附源码下载)
2016/02/25 Javascript
基于JavaScript实现轮播图代码
2016/07/14 Javascript
JS如何设置iOS中微信浏览器的title
2016/11/22 Javascript
webpack 2的react开发配置实例代码
2017/07/28 Javascript
Vue Socket.io源码解读
2018/02/07 Javascript
Vue 组件传值几种常用方法【总结】
2018/05/28 Javascript
React性能优化系列之减少props改变的实现方法
2019/01/17 Javascript
微信小程序MUI导航栏透明渐变功能示例(通过改变opacity实现)
2019/01/24 Javascript
layer设置maxWidth及maxHeight解决方案
2019/07/26 Javascript
[03:40]DOTA2英雄梦之声_第01期_炼金术士
2014/06/23 DOTA
[38:42]完美世界DOTA2联赛循环赛 Matador vs Forest BO2第二场 11.05
2020/11/05 DOTA
python实现绘制树枝简单示例
2014/07/24 Python
使用IPython来操作Docker容器的入门指引
2015/04/08 Python
在Python的Flask框架下使用sqlalchemy库的简单教程
2015/04/09 Python
在Python的Django框架中编写编译函数
2015/07/20 Python
在Mac OS上使用mod_wsgi连接Python与Apache服务器
2015/12/24 Python
python实现折半查找和归并排序算法
2017/04/14 Python
分析Python读取文件时的路径问题
2018/02/11 Python
解决csv.writer写入文件有多余的空行问题
2018/07/06 Python
python自动发邮件总结及实例说明【推荐】
2019/05/31 Python
tensorflow将图片保存为tfrecord和tfrecord的读取方式
2020/02/17 Python
配件采购员岗位职责
2013/12/03 职场文书
个人贷款承诺书
2014/03/28 职场文书
四下基层实施方案
2014/03/28 职场文书
公务员政审单位鉴定材料
2014/05/16 职场文书
MySQL令人咋舌的隐式转换
2021/04/05 MySQL
警用民用对讲机找不同
2022/02/18 无线电
SQL中的连接查询详解
2022/06/21 SQL Server