浅谈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实现首页链接查询 友情链接检查的代码
Jan 05 PHP
php中经典方法实现判断多维数组是否为空
Oct 23 PHP
PHP程序级守护进程的实现与优化的使用概述
May 02 PHP
php的数组与字符串的转换函数整理汇总
Jul 18 PHP
JoshChen_web格式编码UTF8-无BOM的小细节分析
Aug 16 PHP
PHP基于GD库的缩略图生成代码(支持jpg,gif,png格式)
Jun 19 PHP
PHP使用GIFEncoder类生成gif动态滚动字幕
Jul 01 PHP
Thinkphp中数据按分类嵌套循环实现方法
Oct 30 PHP
PHP中开启gzip压缩的2种方法
Jan 31 PHP
PHP实现对png图像进行缩放的方法(支持透明背景)
Jul 15 PHP
详解PHP数组赋值方法
Nov 07 PHP
Yii框架视图、视图布局、视图数据块操作示例
Oct 14 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中获取文件扩展名的N种方法小结
2012/02/27 PHP
解析centos中Apache、php、mysql 默认安装路径
2013/06/25 PHP
Laravel 5框架学习之向视图传送数据(进阶篇)
2015/04/08 PHP
详解WordPress中分类函数wp_list_categories的使用
2016/01/04 PHP
在WordPress中安装使用视频播放器插件Hana Flv Player
2016/01/04 PHP
用JavaScript调用WebService的示例
2008/04/07 Javascript
javascript中的缓动效果实现程序
2012/12/29 Javascript
验证码在IE中不刷新而谷歌等浏览器正常的解决方案
2014/03/18 Javascript
使用Jquery获取带特殊符号的ID 标签的方法
2014/04/30 Javascript
jQuery 中$(this).index与$.each的使用指南
2014/11/20 Javascript
在JavaScript中处理数组之reverse()方法的使用
2015/06/09 Javascript
jQuery对JSON数据进行排序输出的方法
2015/06/24 Javascript
异步安全加载javascript文件的方法
2015/07/21 Javascript
jQuery实现鼠标滑过点击事件音效试听
2015/08/31 Javascript
判断JS对象是否拥有某属性的方法推荐
2016/05/12 Javascript
关于javascript中限定时间内防止按钮重复点击的思路详解
2016/08/16 Javascript
Element Notification通知的实现示例
2020/07/27 Javascript
Vue中添加滚动事件设置的方法详解
2020/09/14 Javascript
swiper4实现移动端导航栏tab滑动切换
2020/10/16 Javascript
antd Select下拉菜单动态添加option里的内容操作
2020/11/02 Javascript
使用Python的Scrapy框架编写web爬虫的简单示例
2015/04/17 Python
利用Python开发微信支付的注意事项
2016/08/19 Python
Python实现合并两个列表的方法分析
2018/05/28 Python
Django添加sitemap的方法示例
2018/08/06 Python
Python 中 function(#) (X)格式 和 (#)在Python3.*中的注意事项
2018/11/30 Python
Python GUI编程学习笔记之tkinter界面布局显示详解
2020/03/30 Python
python分布式爬虫中消息队列知识点详解
2020/11/26 Python
Python 可视化神器Plotly详解
2020/12/26 Python
基于Python的接口自动化读写excel文件的方法
2021/01/15 Python
CSS3 实现时间轴动画
2020/11/25 HTML / CSS
泰国时尚电商:POMELO Fashion
2020/03/11 全球购物
写自荐信要注意什么
2013/12/26 职场文书
表彰大会主持词
2014/03/26 职场文书
库房保管员岗位职责
2014/04/07 职场文书
写给医院的感谢信
2015/01/22 职场文书
暑假生活随笔
2015/08/15 职场文书