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+.htaccess实现全站静态HTML文件GZIP压缩传输(一)
Feb 15 PHP
不要轻信 PHP_SELF的安全问题
Sep 05 PHP
php类中private属性继承问题分析
Nov 01 PHP
php+mysqli实现将数据库中一张表信息打印到表格里的方法
Jan 28 PHP
php转换颜色为其反色的方法
Apr 27 PHP
php实现向javascript传递数组的方法
Jul 27 PHP
php-beanstalkd消息队列类实例分享
Jul 19 PHP
laravel withCount 统计关联数量的方法
Oct 10 PHP
Laravel框架实现定时Task Scheduling例子
Oct 22 PHP
ThinkPHP5 框架引入 Go AOP,PHP AOP编程项目详解
May 12 PHP
PHP实现简单日历类编写
Aug 28 PHP
PHP替换Word中变量并导出PDF图片的实现方法
Nov 26 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/06/07 PHP
php仿discuz分页效果代码
2008/10/02 PHP
PHP 获取远程文件大小的3种解决方法
2013/07/11 PHP
php防止sql注入示例分析和几种常见攻击正则表达式
2014/01/12 PHP
PHP面向对象之后期静态绑定功能介绍
2015/05/18 PHP
基于PHP实现数据分页显示功能
2016/05/26 PHP
Yii CFileCache 获取不到值的原因分析
2017/02/08 PHP
Laravel5.5 数据库迁移:创建表与修改表示例
2019/10/23 PHP
JavaScript 对象成员的可见性说明
2009/10/16 Javascript
window.dialogArguments 使用说明
2011/04/11 Javascript
JavaScript中“+”的陷阱深刻理解
2012/12/04 Javascript
Js动态添加复选框Checkbox的实例方法
2013/04/08 Javascript
浅析BootStrap模态框的使用(经典)
2016/04/29 Javascript
简单理解Vue条件渲染
2016/12/03 Javascript
vue组件之Alert的实现代码
2017/10/17 Javascript
js序列化和反序列化的使用讲解
2019/01/19 Javascript
vue中格式化时间过滤器代码实例
2019/04/17 Javascript
详解微信小程序网络请求接口封装实例
2019/05/02 Javascript
基于layPage插件实现两种分页方式浅析
2019/07/27 Javascript
jquery.pager.js分页实现详解
2019/07/29 jQuery
vue 更改连接后台的api示例
2019/11/11 Javascript
详解Node.js使用token进行认证的简单示例
2020/05/25 Javascript
JS数组reduce()方法原理及使用技巧解析
2020/07/14 Javascript
原生js实现无缝轮播图效果
2021/01/28 Javascript
Django的session中对于用户验证的支持
2015/07/23 Python
Python中random模块生成随机数详解
2016/03/10 Python
8种用Python实现线性回归的方法对比详解
2019/07/10 Python
详解字符串在Python内部是如何省内存的
2020/02/03 Python
pandas 强制类型转换 df.astype实例
2020/04/09 Python
TensorFlow固化模型的实现操作
2020/05/26 Python
越南综合购物网站:Lazada越南
2019/06/10 全球购物
介绍一下UNIX启动过程
2013/11/14 面试题
PHP引擎php.ini参数优化深入讲解
2021/03/24 PHP
中秋节感想
2015/08/10 职场文书
《刷子李》教学反思
2016/02/20 职场文书
Vue自定义铃声提示音组件的实现
2022/01/22 Vue.js