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
ThinkPHP实现事务回滚示例代码
Jun 23 PHP
php强制运行广告的方法
Dec 01 PHP
PHP版微信小店接口开发实例
Nov 12 PHP
php7 安装yar 生成docker镜像
May 09 PHP
基于PHP实现栈数据结构和括号匹配算法示例
Aug 10 PHP
详解php与ethereum客户端交互
Apr 28 PHP
ThinkPHP框架实现的邮箱激活功能示例
Jun 15 PHP
PHP xpath()函数讲解
Feb 11 PHP
浅析PHP中的 inet_pton 网络函数
Dec 16 PHP
thinkphp5实现微信扫码支付
Dec 23 PHP
php设计模式之享元模式分析【星际争霸游戏案例】
Mar 23 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在字符串中查找另一个字符串
2008/11/19 PHP
php 生成文字png图片的代码
2011/04/17 PHP
PHP 获取MySQL数据库里所有表的实现代码
2011/07/13 PHP
PHP对象Object的概念 介绍
2012/06/14 PHP
dreamweaver 安装Jquery智能提示
2011/04/02 Javascript
javascript错误的认识不用关心内存管理
2012/12/15 Javascript
js库Modernizr的介绍和使用
2015/05/07 Javascript
JQuery validate插件Remote用法大全
2016/05/15 Javascript
js简单获取表单中单选按钮值的方法
2016/08/23 Javascript
JS识别浏览器类型(电脑浏览器和手机浏览器)
2016/11/18 Javascript
详解js中call与apply关键字的作用
2016/11/21 Javascript
vue一步步实现alert功能
2017/07/05 Javascript
JS实现获取进今年第几天是周几的方法分析
2018/06/27 Javascript
基于Webpack4和React hooks搭建项目的方法
2019/02/05 Javascript
vue 列表页跳转详情页获取id以及详情页通过id获取数据
2019/03/27 Javascript
Vue-cli3.X使用px2 rem遇到的问题及解决方法
2019/08/08 Javascript
JavaScript的垃圾回收机制与内存管理
2020/08/06 Javascript
jquery实现简单每周轮换的日历
2020/09/10 jQuery
[01:15:45]DOTA2上海特级锦标赛B组小组赛#1 Alliance VS Spirit第一局
2016/02/26 DOTA
[00:47]DOTA2荣耀之路6:玩不了啦!
2018/05/30 DOTA
Python监控主机是否存活并以邮件报警
2015/09/22 Python
Python ftp上传文件
2016/02/13 Python
python字符类型的一些方法小结
2016/05/16 Python
浅谈Django学习migrate和makemigrations的差别
2018/01/18 Python
对python Tkinter Text的用法详解
2018/10/11 Python
Django框架实现分页显示内容的方法详解
2019/05/10 Python
Django之编辑时根据条件跳转回原页面的方法
2019/08/21 Python
wxpython自定义下拉列表框过程图解
2020/02/14 Python
浅谈opencv自动光学检测、目标分割和检测(连通区域和findContours)
2020/06/04 Python
利用Python如何画一颗心、小人发射爱心
2021/02/21 Python
Fairyseason:为个人和批发商提供女装和配件
2017/03/01 全球购物
单位领导证婚词
2014/01/14 职场文书
美术专业个人自我评价
2014/01/18 职场文书
函授本科自我鉴定
2014/02/04 职场文书
四风问题自我剖析材料
2014/10/07 职场文书
Nginx配置https原理及实现过程详解
2021/03/31 Servers