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设计模式 DAO(数据访问对象模式)
Jun 26 PHP
php比较多维数组中值的大小排序实现代码
Sep 08 PHP
用php随机生成福彩双色球号码的2种方法
Feb 04 PHP
深入php之规范编程命名小结
May 15 PHP
如何使用PHP计算上一个月的今天
May 23 PHP
如何使用FireFox插件FirePHP调试PHP
Jul 23 PHP
从PHP的源码中深入了解stdClass类
Apr 18 PHP
PHP自带函数给数字或字符串自动补齐位数
Jul 29 PHP
php实现TCP端口检测的方法
Apr 01 PHP
PHP7.0版本备注
Jul 23 PHP
浅谈php://filter的妙用
Mar 05 PHP
解决laravel资源加载路径设置的问题
Oct 14 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编程效率 引入缓存机制提升性能
2010/02/15 PHP
PHP常用文件操作函数和简单实例分析
2016/06/03 PHP
PHP微信分享开发详解
2017/01/14 PHP
PHP反射学习入门示例
2019/06/14 PHP
19个很有用的 JavaScript库推荐
2011/06/27 Javascript
jquery中交替点击事件toggle方法的使用示例
2013/12/08 Javascript
jqGrid中文文档之选项设置
2015/12/02 Javascript
javascript中的3种继承实现方法
2016/01/27 Javascript
基于HTML5上使用iScroll实现下拉刷新,上拉加载更多
2016/05/21 Javascript
jQuery tagsinput在h5邮件客户端中应用详解
2016/09/26 Javascript
javascript 动态脚本添加的简单方法
2016/10/11 Javascript
完全深入学习Bootstrap表单
2016/11/28 Javascript
JS实现简易的图片拖拽排序实例代码
2017/06/09 Javascript
详解axios 全攻略之基本介绍与使用(GET 与 POST)
2017/09/15 Javascript
信息滚动效果的实例讲解
2017/09/18 Javascript
vue里面父组件修改子组件样式的方法
2018/02/03 Javascript
elementUI Vue 单个按钮显示和隐藏的变换功能(两种方法)
2018/09/04 Javascript
vue实现分页组件
2020/06/16 Javascript
Python根据当前日期取去年同星期日期
2019/04/14 Python
python3 selenium自动化测试 强大的CSS定位方法
2019/08/23 Python
Keras 利用sklearn的ROC-AUC建立评价函数详解
2020/06/15 Python
使用python-cv2实现视频的分解与合成的示例代码
2020/10/26 Python
PyCharm最新激活码PyCharm2020.2.3有效
2020/11/18 Python
PyCharm Community安装与配置的详细教程
2020/11/24 Python
使用python画出逻辑斯蒂映射(logistic map)中的分叉图案例
2020/12/11 Python
24岁生日感言
2014/01/13 职场文书
导购员的岗位职责
2014/02/08 职场文书
小学二年级评语
2014/04/21 职场文书
酒店七夕情人节活动策划方案
2014/08/24 职场文书
小学生竞选班干部演讲稿(5篇)
2014/09/12 职场文书
幼儿园校园小喇叭广播稿
2014/10/17 职场文书
赵乐秦在党的群众路线教育实践活动总结大会上的讲话稿
2014/10/25 职场文书
学校师德师风整改方案
2014/10/28 职场文书
廉政承诺书
2015/01/19 职场文书
python3 实现mysql数据库连接池的示例代码
2021/04/17 Python
MySQL中日期型单行函数代码详解
2021/06/21 MySQL