浅谈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 empty,isset,is_null判断比较(差异与异同)
Oct 19 PHP
php中判断字符串是否全是中文或含有中文的实现代码
Sep 16 PHP
php 计划任务 检测用户连接状态
Mar 29 PHP
PHP取整数函数常用的四种方法小结
Jul 05 PHP
深入理解ob_flush和flush的区别(ob_flush()与flush()使用方法)
Feb 06 PHP
浅谈web上存漏洞及原理分析、防范方法(文件名检测漏洞)
Jun 29 PHP
PHP入门之常量简介和系统常量
May 12 PHP
php中fsockopen用法实例
Jan 05 PHP
php实现session自定义会话处理器的方法
Jan 27 PHP
php利用嵌套数组拼接与解析json的方法
Feb 07 PHP
PHP命名空间用法实例分析
Sep 04 PHP
PHP与Web页面的交互示例详解二
Aug 04 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实现简单的计算器
2020/08/28 PHP
LazyLoad 延迟加载(按需加载)
2010/05/31 Javascript
js判断输入是否为正整数、浮点数等数字的函数代码
2010/11/17 Javascript
JavaScript高级程序设计(第3版)学习笔记2 js基础语法
2012/10/11 Javascript
html组件不可输入(只读)同时任何组件都有效
2013/04/01 Javascript
两个数组去重的JS代码
2013/12/04 Javascript
JQuery对表格进行操作的常用技巧总结
2014/04/23 Javascript
DOM事件阶段以及事件捕获与事件冒泡先后执行顺序(图文详解)
2015/08/18 Javascript
轻松学习jQuery插件EasyUI EasyUI表单验证
2015/12/01 Javascript
超实用的JavaScript表单代码段
2016/02/26 Javascript
jquery实现左右无缝轮播图
2020/07/31 Javascript
Jquery中map函数的用法
2016/06/03 Javascript
遍历json获得数据的几种方法小结
2017/01/21 Javascript
a标签置灰不可点击的实现方法
2017/02/06 Javascript
慕课网题目之js实现抽奖系统功能
2017/09/19 Javascript
JS实现获取进今年第几天是周几的方法分析
2018/06/27 Javascript
微信小程序开发问题之wx.previewImage
2018/12/25 Javascript
微信小程序模板消息限制实现无限制主动推送的示例代码
2019/08/27 Javascript
vue中实现回车键登录功能
2020/02/19 Javascript
基于canvas实现手写签名(vue)
2020/05/21 Javascript
python实现pdf转换成word/txt纯文本文件
2018/06/07 Python
tensorflow 查看梯度方式
2020/02/04 Python
Python 格式化输出_String Formatting_控制小数点位数的实例详解
2020/02/04 Python
django 解决自定义序列化返回处理数据为null的问题
2020/05/20 Python
Python Scrapy图片爬取原理及代码实例
2020/06/12 Python
python制作抽奖程序代码详解
2021/01/15 Python
澳大利亚UGG工厂直销:Australian Ugg Boots
2017/10/14 全球购物
全球采购的街头服饰和帽子:Urban Excess
2020/10/28 全球购物
中软国际Java程序员机试题
2012/08/19 面试题
护理专业大学生自我推荐信
2014/01/25 职场文书
校园安全教育广播稿
2014/02/17 职场文书
企业标语大全
2014/07/01 职场文书
环卫工作汇报材料
2014/10/28 职场文书
青年人初次创业的“五不要”
2019/08/23 职场文书
ant design vue的form表单取值方法
2022/06/01 Vue.js
Django框架中表单的用法
2022/06/10 Python