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中,文件上传
Dec 06 PHP
PHPMyAdmin 快速配置方法
May 11 PHP
PHP压缩html网页代码(清除空格,换行符,制表符,注释标记)
Apr 02 PHP
php计算十二星座的函数代码
Aug 21 PHP
php读取EXCEL文件 php excelreader读取excel文件
Dec 06 PHP
PHP中常用的转义函数
Feb 28 PHP
ThinkPHP快速入门实例教程之数据分页
Jul 01 PHP
php中memcache 基本操作实例
May 17 PHP
Symfony2实现在doctrine中内置数据的方法
Feb 05 PHP
PHP实现redis限制单ip、单用户的访问次数功能示例
Jun 16 PHP
PHP中单例模式的使用场景与使用方法讲解
Mar 18 PHP
tp5.1 框架查询表达式用法详解
May 25 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
深入了解php4(1)--回到未来
2006/10/09 PHP
解析Ubuntu下crontab命令的用法
2013/06/24 PHP
php实现的验证码文件类实例
2015/06/18 PHP
PHP和Mysql中转UTF8编码问题汇总
2015/10/10 PHP
基于Codeigniter框架实现的student信息系统站点动态发布功能详解
2017/03/23 PHP
PHP读取、解析eml文件及生成网页的方法示例
2017/09/04 PHP
PHP 命名空间和自动加载原理与用法实例分析
2020/04/29 PHP
JavaScript开发时的五个注意事项
2007/12/08 Javascript
JQuery的read函数与js的onload不同方式实现
2013/03/18 Javascript
js清理Word格式示例代码
2014/02/13 Javascript
jQuery 添加样式属性的优先级别方法(推荐)
2017/06/08 jQuery
mac上配置Android环境变量的方法
2018/07/08 Javascript
React 项目迁移 Webpack Babel7的实现
2018/09/12 Javascript
jQuery实现评论模块
2020/08/19 jQuery
python的正则表达式re模块的常用方法
2013/03/09 Python
在Python中操作字典之update()方法的使用
2015/05/22 Python
简单介绍Python的Django框架的dj-scaffold项目
2015/05/30 Python
python对矩阵进行转置的2种处理方法
2019/07/17 Python
python实现的汉诺塔算法示例
2019/10/23 Python
使用jupyter notebook将文件保存为Markdown,HTML等文件格式
2020/04/14 Python
TensorFlow保存TensorBoard图像操作
2020/06/23 Python
详解python的super()的作用和原理
2020/10/29 Python
英国领先的维生素和营养补充剂直接供应商:Healthspan
2019/04/22 全球购物
奥地利智能家居和智能生活网上商店:tink.at
2019/10/07 全球购物
Tessabit日本:集世界奢侈品和设计师品牌的意大利精品买手店
2020/01/07 全球购物
网络安全类面试题
2015/08/01 面试题
采购类个人求职的自我评价
2014/02/18 职场文书
《画风》教学反思
2014/04/16 职场文书
会计求职信
2014/05/29 职场文书
公民授权委托书范本
2014/09/17 职场文书
干部作风整顿个人剖析材料
2014/10/06 职场文书
工作保证书怎么写
2015/02/28 职场文书
护理工作个人总结
2015/03/03 职场文书
运动会广播稿200字
2015/08/19 职场文书
NodeJs内存占用过高的排查实战记录
2021/05/10 NodeJs
MySQL数据库中varchar类型的数字比较大小的方法
2021/11/17 MySQL