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 可阅读随机字符串代码
May 26 PHP
生成ubuntu自动切换壁纸xml文件的php代码
Jul 17 PHP
PHP中调用ASP.NET的WebService的代码
Apr 22 PHP
PHP中mb_convert_encoding与iconv函数的深入解析
Jun 21 PHP
PHP上传文件时文件过大$_FILES为空的解决方法
Nov 26 PHP
PHP 函数call_user_func和call_user_func_array用法详解
Mar 02 PHP
Yii2中如何使用modal弹窗(基本使用)
May 30 PHP
Joomla框架实现字符串截取的方法示例
Jul 18 PHP
PHP简单实现欧拉函数Euler功能示例
Nov 06 PHP
PHP设计模式之原型设计模式原理与用法分析
Apr 25 PHP
ThinkPHP框架实现的邮箱激活功能示例
Jun 15 PHP
PHP 文件上传限制问题
Sep 01 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
全国FM电台频率大全 - 14 江西省
2020/03/11 无线电
Windows下PHP的任意文件执行漏洞
2006/10/09 PHP
php利用iframe实现无刷新文件上传功能的代码
2011/09/29 PHP
php中创建和调用webservice接口示例
2014/07/25 PHP
php实现改变图片直接打开为下载的方法
2015/04/14 PHP
得到文本框选中的文字,动态插入文字的js代码
2007/03/07 Javascript
Jquery 滑入滑出效果实现代码
2010/03/27 Javascript
js中scrollHeight,scrollWidth,scrollLeft,scrolltop等差别介绍
2012/05/16 Javascript
悬浮数字的实现案例
2014/02/19 Javascript
javascript页面渲染速度测试脚本分享
2014/04/15 Javascript
js实现局部页面打印预览原理及示例代码
2014/07/03 Javascript
javascript 实现 原路返回
2015/01/21 Javascript
js制作网站首页图片轮播特效代码
2016/08/30 Javascript
js微信扫描二维码登录网站技术原理
2016/12/01 Javascript
JavaScript禁止微信浏览器下拉回弹效果
2017/05/16 Javascript
基于Vue的SPA动态修改页面title的方法(推荐)
2018/01/02 Javascript
详解javascript常用工具类的封装
2018/01/30 Javascript
vue中axios解决跨域问题和拦截器的使用方法
2018/03/07 Javascript
详解angular如何调用HTML字符串的方法
2018/06/30 Javascript
微信小程序外卖选购页实现切换分类与数量加减功能案例
2019/01/15 Javascript
[01:24:09]Ti4 冒泡赛第二轮DK vs C9 1
2014/07/14 DOTA
Python的函数的一些高阶特性
2015/04/27 Python
Python字符和字符值(ASCII或Unicode码值)转换方法
2015/05/21 Python
Python如何实现守护进程的方法示例
2017/02/08 Python
Python中property函数用法实例分析
2018/06/04 Python
python绘制随机网络图形示例
2019/11/21 Python
wxpython多线程防假死与线程间传递消息实例详解
2019/12/13 Python
使用Python实现将多表分批次从数据库导出到Excel
2020/05/15 Python
韩国爱茉莉太平洋化妆品美国站:Amore Pacific US
2016/10/28 全球购物
澳大利亚最好的厨具店:Kitchen Warehouse
2018/03/13 全球购物
什么是抽象
2015/12/13 面试题
员工年终考核评语
2014/12/31 职场文书
清明节网上祭英烈寄语2015
2015/03/04 职场文书
运动员入场词
2015/07/18 职场文书
话题作文之成长
2019/12/09 职场文书
SQL试题 使用窗口函数选出连续3天登录的用户
2022/04/24 Oracle