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远程连接MYSQL数据库非常慢的解决方法
Jul 05 PHP
php Smarty模板生成html文档的方法
Apr 12 PHP
php数组去重的函数代码
Feb 03 PHP
CI框架开发新浪微博登录接口源码完整版
May 28 PHP
php中使用key,value,current,next和prev函数遍历数组的方法
Mar 17 PHP
PHP利用APC模块实现大文件上传进度条的方法
Oct 29 PHP
PHP 中 DOMDocument保存xml时中文出现乱码问题的解决方案
Sep 19 PHP
PHP二分查找算法示例【递归与非递归方法】
Sep 29 PHP
PHP CodeIgniter分页实例及多条件查询解决方案(推荐)
May 20 PHP
Laravel 使用查询构造器配合原生sql语句查询的例子
Oct 12 PHP
解决thinkPHP 5 nginx 部署时,只跳转首页的问题
Oct 16 PHP
TP5框架实现的数据库备份功能示例
Apr 05 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
一个用于网络的工具函数库
2006/10/09 PHP
用PHP中的 == 运算符进行字符串比较
2006/11/26 PHP
PHP小技巧搜集,每个PHPer都来露一手
2007/01/02 PHP
用PHP ob_start()控制浏览器cache、生成html实现代码
2010/02/16 PHP
ThinkPHP采用原生query实现关联查询left join实例
2014/12/02 PHP
PHP使用Redis替代文件存储Session的方法
2017/02/15 PHP
php使用crypt()函数进行加密
2017/06/08 PHP
PHP实现的登录页面信息提示功能示例
2017/07/24 PHP
JQuery实现的在新窗口打开链接的方法小结
2010/04/22 Javascript
chrome原生方法之数组
2011/11/30 Javascript
Javascript中this关键字的一些小知识
2015/03/15 Javascript
javascript日期验证之输入日期大于等于当前日期
2015/12/13 Javascript
jQuery动态添加及删除表单上传元素的方法(附demo源码下载)
2016/01/15 Javascript
jQuery学习之DOM节点的插入方法总结
2017/01/22 Javascript
ES6中箭头函数的定义与调用方式详解
2017/06/02 Javascript
解决vue的变量在settimeout内部效果失效的问题
2018/08/30 Javascript
分享5个顶级的JavaScript Ajax组件库
2018/09/16 Javascript
Vue 路由间跳转和新开窗口的方式(query、params)
2019/12/25 Javascript
python登录pop3邮件服务器接收邮件的方法
2015/04/30 Python
python实现在sqlite动态创建表的方法
2015/05/08 Python
Python实现遍历数据库并获取key的值
2015/05/17 Python
Python中selenium实现文件上传所有方法整理总结
2017/04/01 Python
Android基于TCP和URL协议的网络编程示例【附demo源码下载】
2018/01/23 Python
利用python库在局域网内传输文件的方法
2018/06/04 Python
python安装scipy的方法步骤
2019/06/26 Python
使用django实现一个代码发布系统
2019/07/18 Python
详解程序意外中断自动重启shell脚本(以Python为例)
2019/07/26 Python
html5中监听canvas内部元素点击事件的三种方法
2019/04/28 HTML / CSS
网购亚洲时装、美容产品和生活百货:YesStyle
2016/09/15 全球购物
澳大利亚珠宝商:Shiels
2019/10/06 全球购物
全球最大的生存食品、水和装备专用在线市场:BePrepared.com
2020/01/02 全球购物
寄语是什么意思
2014/04/10 职场文书
运动会广播稿50字-100字
2014/10/11 职场文书
2020年个人安全保证书参考模板
2020/01/08 职场文书
TensorFlow中tf.batch_matmul()的用法
2021/06/02 Python
小程序自定义轮播图圆点组件
2022/06/25 Javascript