浅谈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 相关文章推荐
substr()函数中文版
Oct 09 PHP
php短域名转换为实际域名函数
Jan 17 PHP
PHP5.3的垃圾回收机制(动态存储分配方案)深入理解
Dec 10 PHP
php cookie使用方法学习笔记分享
Nov 07 PHP
php加密解密实用类分享
Jan 07 PHP
php5.3 goto函数介绍和示例
Mar 21 PHP
ThinkPHP3.1新特性之G方法的使用
Jun 19 PHP
php实现汉字验证码和算式验证码的方法
Mar 07 PHP
php实现产品加入购物车功能(1)
Jul 23 PHP
PHP实现的简单适配器模式示例
Jun 22 PHP
PHP微信发送推送消息乱码的解决方法
Feb 28 PHP
PHP 实现缩略图
Mar 09 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 分库分表hash算法
2009/11/12 PHP
php pki加密技术(openssl)详解
2013/07/01 PHP
使用javascript做的一个随机点名程序
2014/02/13 Javascript
js 去除字符串第一位逗号的方法
2014/06/07 Javascript
jQuery $.each遍历对象、数组用法实例
2015/04/16 Javascript
javascript实现动态统计图开发实例
2015/11/21 Javascript
javascript中的作用域和闭包详解
2016/01/13 Javascript
JQuery EasyUI的使用
2016/02/24 Javascript
js+html5实现canvas绘制椭圆形图案的方法
2016/05/21 Javascript
全面解析JavaScript中apply和call以及bind(推荐)
2016/06/15 Javascript
jquery实现界面无刷新加载登陆注册
2016/07/30 Javascript
基于Bootstrap仿淘宝分页控件实现代码
2016/11/07 Javascript
javascript 产生随机数的几种方法总结
2017/09/26 Javascript
Vue加载组件、动态加载组件的几种方式
2018/08/31 Javascript
element UI upload组件上传附件格式限制方法
2018/09/04 Javascript
浏览器事件循环与vue nextTicket的实现
2019/04/16 Javascript
JS检索下拉列表框中被选项目的索引号(selectedIndex)
2019/12/17 Javascript
Python的Django框架中的表单处理示例
2015/07/17 Python
python中json格式数据输出的简单实现方法
2016/10/31 Python
200行自定义python异步非阻塞Web框架
2017/03/15 Python
基于MTCNN/TensorFlow实现人脸检测
2018/05/24 Python
python的concat等多种用法详解
2018/11/28 Python
Python 普通最小二乘法(OLS)进行多项式拟合的方法
2018/12/29 Python
Python 字符串类型列表转换成真正列表类型过程解析
2019/08/26 Python
Python 实现日志同时输出到屏幕和文件
2020/02/19 Python
Django之腾讯云短信的实现
2020/06/12 Python
Python3如何使用range函数替代xrange函数
2020/10/05 Python
python 基于pygame实现俄罗斯方块
2021/03/02 Python
精灵市场:Pixie Market
2019/06/18 全球购物
大学生护理专业自荐信
2013/10/03 职场文书
超市促销活动方案
2014/03/05 职场文书
学生鉴定评语大全
2014/05/05 职场文书
国际贸易毕业生求职信
2014/07/20 职场文书
党员领导干部民主生活会批评与自我批评发言
2014/09/28 职场文书
Python使用psutil库对系统数据进行采集监控的方法
2021/08/23 Python
正则表达式拆分url实例代码
2022/02/24 Java/Android