浅谈PHP的反射机制


Posted in PHP onDecember 15, 2016

1. 介绍

-- 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

2. 具体例子

创建一个Person类,然后使用ReflectionClass反射它

2.1)【创建Persion类】

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; 
 publicfunction 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; 
   } 
 }
Persion

2.2)【反射过程】

接下来反射它,只要把类名"Person"传递给ReflectionClass就可以了:

$class = new ReflectionClass('Person');//建立 Person这个类的反射类
$instance = $class->newInstanceArgs($args);//相当于实例化Person 类

2.3)【反射后使用】

2.3.1)获取属性(Properties)

$properties = $class->getProperties(); 
 foreach($properties as $property) { 
 echo $property->getName()."\n"; 
 } 
 // 输出:
 // _allowDynamicAttributes
 // id
 // name
 // biography

默认情况下,ReflectionClass会获取到所有的属性,private 和 protected的也可以。如果只想获取到private属性,就要额外传个参数:

privateproperties=privateproperties=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.3.2)【获取注释】

通过getDocComment可以得到写给property的注释。

foreach($propertiesas$property) { 
 if($property->isProtected()) { 
 $docblock = $property->getDocComment(); 
   preg_match('/ type\=([a-z_]*) /', $property->getDocComment(), $matches); 
 echo$matches[1]."\n"; 
  } 
 } 
 // Output:
 // primary_autoincrement
 // varchar
 // text

2.3.3)【获取类的方法】

获取方法(methods):通过getMethods() 来获取到类的所有methods。

2.3.4)【执行类的方法】

$instance->getBiography(); //执行Person 里的方法getBiography
 //或者:
 $ec=$class->getmethod('getName'); //获取Person 类中的getName方法
 $ec->invoke($instance);  //执行getName 方法

以上就是本文的全部内容,希望本文的内容对大家的学习或者工作能带来一定的帮助,同时也希望多多支持三水点靠木!

PHP 相关文章推荐
繁体中文转换为简体中文的PHP函数
Oct 09 PHP
PHP正则的Unknown Modifier错误解决方法
Mar 02 PHP
PHP二维数组的去重问题解析
Jul 17 PHP
phpExcel导出大量数据出现内存溢出错误的解决方法
Feb 28 PHP
php简单的留言板与回复功能具体实现
Feb 19 PHP
CodeIgniter框架过滤HTML危险代码
Jun 12 PHP
PHP批量去除BOM头内容信息代码
Mar 11 PHP
PHP性能优化大全(php.ini)
May 20 PHP
PHP获取当前日期及本周一是几月几号的方法
Mar 28 PHP
完美的php分页类
Oct 24 PHP
php 调用百度sms来发送短信的实现示例
Nov 02 PHP
THINKPHP5.1 Config的配置与获取详解
Jun 08 PHP
php 三元运算符实例详细介绍
Dec 15 #PHP
PHP的CURL方法curl_setopt()函数案例介绍(抓取网页,POST数据)
Dec 14 #PHP
使用PHP下载CSS文件中的所有图片【几行代码即可实现】
Dec 14 #PHP
Thinkphp 中 distinct 的用法解析
Dec 14 #PHP
PHP 500报错的快速解决方法
Dec 14 #PHP
php json中文编码为null的解决办法
Dec 14 #PHP
PHP正则匹配日期和时间(时间戳转换)的实例代码
Dec 14 #PHP
You might like
php提交post数组参数实例分析
2015/12/17 PHP
浅谈laravel框架sql中groupBy之后排序的问题
2019/10/17 PHP
tp5.1 框架数据库常见操作详解【添加、删除、更新、查询】
2020/05/26 PHP
JS 巧妙获取剪贴板数据 Excel数据的粘贴
2009/07/09 Javascript
JQuery读取XML文件数据并显示的实现代码
2009/12/16 Javascript
JavaScript学习笔记记录我的旅程
2012/05/23 Javascript
JS分页效果示例
2013/10/11 Javascript
javascript实现复选框选中属性
2015/03/25 Javascript
解决jquery中动态新增的元素节点无法触发事件问题的两种方法
2015/10/30 Javascript
Ionic2系列之使用DeepLinker实现指定页面URL
2016/11/21 Javascript
React Native 通告消息竖向轮播组件的封装
2020/08/25 Javascript
AngularJS实现图片上传和预览功能的方法分析
2017/11/08 Javascript
微信小程序商品详情页的底部弹出框效果
2020/11/16 Javascript
JavaScript检查数据中是否存在相同的元素(两种方法)
2018/10/07 Javascript
CentOS7中源码编译安装NodeJS的完整步骤
2018/10/13 NodeJs
新年快乐! javascript实现超级炫酷的3D烟花特效
2019/01/30 Javascript
ES6数组与对象的解构赋值详解
2019/06/14 Javascript
layUI实现三级导航菜单效果
2019/07/26 Javascript
vue3中轻松实现switch功能组件的全过程
2021/01/07 Vue.js
Python装饰器的函数式编程详解
2015/02/27 Python
探索Python3.4中新引入的asyncio模块
2015/04/08 Python
python使用scrapy发送post请求的坑
2018/09/04 Python
django session完成状态保持的方法
2018/11/27 Python
python按比例随机切分数据的实现
2019/07/11 Python
python3图片文件批量重命名处理
2019/10/31 Python
基于Python制作一副扑克牌过程详解
2020/10/19 Python
python中lower函数实现方法及用法讲解
2020/12/23 Python
eDreams加拿大:廉价航班、酒店和度假
2019/03/29 全球购物
兴趣小组活动总结
2014/05/05 职场文书
2014政府领导班子对照检查材料思想汇报(3篇)
2014/09/26 职场文书
乡镇党的群众路线教育实践活动总结报告
2014/10/30 职场文书
高中班主任评语
2014/12/30 职场文书
2016高考感言
2015/08/01 职场文书
运动会广播稿50字
2015/08/19 职场文书
反腐倡廉心得体会2016
2016/01/13 职场文书
python解析照片拍摄时间进行图片整理
2022/07/23 Python