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
一个图形显示IP的PHP程序代码
Oct 19 PHP
PHP实现的下载远程图片自定义函数分享
Jan 28 PHP
php选择排序法实现数组排序实例分析
Feb 16 PHP
php通过array_merge()函数合并两个数组的方法
Mar 18 PHP
PHP实现查询两个数组中不同元素的方法
Feb 23 PHP
深入理解PHP中的empty和isset函数
May 26 PHP
PHP转换文本框内容为HTML格式的方法
Jul 20 PHP
Laravel中encrypt和decrypt的实现方法
Sep 24 PHP
PHP堆栈调试操作简单示例
Jun 15 PHP
php文件包含的几种方式总结
Sep 19 PHP
基于thinkphp6.0的success、error实现方法
Nov 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
你可能不知道PHP get_meta_tags()函数
2014/05/12 PHP
最准确的php截取字符串长度函数
2015/10/29 PHP
Laravel接收前端ajax传来的数据的实例代码
2017/07/20 PHP
PHP编程实现计算抽奖概率算法完整实例
2017/08/09 PHP
javascript模仿msgbox提示效果代码
2008/06/10 Javascript
jquery 表单进行客户端验证demo
2009/08/24 Javascript
javascript与CSS复习(《精通javascript》)
2010/06/29 Javascript
IE6,IE7,IE8下使用Javascript记录光标选中范围(已补全)
2011/08/28 Javascript
FireFox下XML对象转化成字符串的解决方法
2011/12/09 Javascript
jQuery 过滤not()与filter()实例代码
2012/05/10 Javascript
js 加密压缩出现bug解决方案
2014/11/25 Javascript
JS实现点击复选框将按钮或文本框变为灰色不可用的方法
2015/08/11 Javascript
IE8下jQuery改变png图片透明度时出现的黑边
2015/08/30 Javascript
AngularJS 指令详细介绍
2016/07/27 Javascript
BootStrap+Angularjs+NgDialog实现模式对话框
2016/08/24 Javascript
利用JS实现点击按钮后图片自动切换的简单方法
2016/10/24 Javascript
JS常用算法实现代码
2016/11/14 Javascript
纯js仿淘宝京东商品放大镜功能
2017/03/02 Javascript
详解用vue-cli来搭建vue项目和webpack
2017/04/20 Javascript
Javascript实现跨域后台设置拦截的方法详解
2017/08/04 Javascript
JS基于封装函数实现的表格分页完整示例
2018/06/26 Javascript
解决vue-cli项目打包出现空白页和路径错误的问题
2018/09/04 Javascript
通过js示例讲解时间复杂度与空间复杂度
2019/08/06 Javascript
[01:07:19]DOTA2-DPC中国联赛 正赛 CDEC vs XG BO3 第一场 1月19日
2021/03/11 DOTA
pandas.loc 选取指定列进行操作的实例
2018/05/18 Python
Selenium定时刷新网页的实现代码
2018/10/31 Python
Python lxml解析HTML并用xpath获取元素的方法
2019/01/02 Python
Python学习笔记之错误和异常及访问错误消息详解
2019/08/08 Python
python使用for...else跳出双层嵌套循环的方法实例
2020/05/17 Python
无惧面试,带你搞懂python 装饰器
2020/08/17 Python
大学专科生推荐信范文
2013/11/23 职场文书
销售找工作求职信
2013/12/20 职场文书
索桥的故事教学反思
2014/02/06 职场文书
人事专员岗位说明书
2014/07/29 职场文书
超市员工管理制度
2015/08/06 职场文书
jquery插件实现代码雨特效
2021/04/24 jQuery