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学习之PHP变量
Oct 09 PHP
PHP操作数组相关函数
Feb 03 PHP
php 大数据量及海量数据处理算法总结
May 07 PHP
PHP写UltraEdit插件脚本实现方法
Dec 26 PHP
PHP设计模式之调解者模式的深入解析
Jun 13 PHP
PHP利用str_replace防注入的方法
Nov 10 PHP
php截取字符串函数分享
Feb 02 PHP
Laravel 5框架学习之用户认证
Apr 09 PHP
PHP自定义函数获取URL中一级域名的方法
Aug 23 PHP
功能强大的PHP发邮件类
Aug 29 PHP
PHP不使用内置函数实现字符串转整型的方法示例
Jul 03 PHP
PHP简单实现二维数组的矩阵转置操作示例
Nov 24 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中检查PHP文件是否有语法错误的方法
2009/12/23 PHP
解析php入库和出库
2013/06/25 PHP
PHP实现补齐关闭的HTML标签
2016/03/22 PHP
PHP实现电商订单自动确认收货redis队列
2017/05/17 PHP
php使用redis的几种常见操作方式和用法示例
2020/02/20 PHP
jQuery操作select的实例代码
2012/06/14 Javascript
JavaScript学习笔记之Cookie对象
2015/01/22 Javascript
ECMAScript6函数剩余参数(Rest Parameters)
2015/06/12 Javascript
JavaScript中Array的实用操作技巧分享
2016/09/11 Javascript
利用jquery实现瀑布流3种案例
2016/09/18 Javascript
微信公众号 摇一摇周边功能开发
2016/12/08 Javascript
你应该知道的几类npm依赖包管理详解
2017/10/06 Javascript
React Native自定义控件底部抽屉菜单的示例
2018/02/08 Javascript
基于Angular中ng-controller父子级嵌套的相关属性详解
2018/10/08 Javascript
详解vue-cli 3.0 build包太大导致首屏过长的解决方案
2018/11/10 Javascript
jQuery实现input输入框获取焦点与失去焦点时提示的消失与显示功能示例
2019/05/27 jQuery
微信小程序自定义菜单切换栏tabbar组件代码实例
2019/12/30 Javascript
jQuery实现简单全选框
2020/09/13 jQuery
微信小程序实现分页加载效果
2020/11/19 Javascript
Javascript新手入门之字符串拼接与变量的应用
2020/12/03 Javascript
vue el-upload上传文件的示例代码
2020/12/21 Vue.js
Python struct模块解析
2014/06/12 Python
基于python中pygame模块的Linux下安装过程(详解)
2017/11/09 Python
python 对任意数据和曲线进行拟合并求出函数表达式的三种解决方案
2020/02/18 Python
python 两种方法删除空文件夹
2020/09/29 Python
python3 使用ssh隧道连接mysql的操作
2020/12/05 Python
安纳塔拉酒店度假村及水疗官方网站:Anantara Hotel
2016/08/25 全球购物
索尼巴西商店:Sony巴西
2019/06/21 全球购物
JNI的定义
2012/11/25 面试题
J2EE相关知识面试题
2013/08/26 面试题
大学新生军训个人的自我评价
2013/10/03 职场文书
市场营销专业应届生自荐信
2014/06/19 职场文书
最新离婚协议书范本
2014/08/19 职场文书
行政文员岗位职责
2015/02/04 职场文书
JavaScript实现简单拖拽效果
2021/09/15 Javascript
python接口测试返回数据为字典取值方式
2022/02/12 Python