浅谈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 数据库树的遍历方法
Feb 06 PHP
php curl的深入解析
Jun 02 PHP
php中OR与|| AND与&&的区别总结
Oct 26 PHP
浅析Yii2 GridView 日期格式化并实现日期可搜索教程
Apr 22 PHP
php基于openssl的rsa加密解密示例
Jul 11 PHP
PHP实现多级分类生成树的方法示例
Feb 07 PHP
Yii2 队列 shmilyzxt/yii2-queue 简单概述
Aug 02 PHP
PHP实现一个多功能购物网站的案例
Sep 13 PHP
利用PHP获取汉字首字母并且分组排序详解
Oct 22 PHP
PHP面向对象五大原则之接口隔离原则(ISP)详解
Apr 04 PHP
php7 新增功能实例总结
May 25 PHP
PHP使用Http Post请求发送Json对象数据代码解析
Jul 16 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 magic quotes的详解
2013/06/17 PHP
PHP以mysqli方式连接类完整代码实例
2014/07/15 PHP
PHP结合jQuery实现找回密码
2015/07/22 PHP
PHP控制反转(IOC)和依赖注入(DI)
2017/03/13 PHP
详解Yii2 之 生成 URL 的方法
2017/06/16 PHP
Laravel框架模板继承操作示例
2018/06/11 PHP
PHP设计模式之观察者模式定义与用法示例
2018/08/04 PHP
PHP中使用mpdf 导出PDF文件的实现方法
2018/10/22 PHP
说说掌握JavaScript语言的思想前提想学习js的朋友可以看看
2009/04/01 Javascript
extjs 学习笔记 四 带分页的grid
2009/10/20 Javascript
jQuery 对Select的操作备忘记录
2011/07/04 Javascript
可在线编辑网页文字效果代码(单击)
2013/03/02 Javascript
关于jQuery对象数据缓存Cache原理以及jQuery.data详解
2013/04/07 Javascript
Jquery动态更改一张位图的src与Attr的使用
2013/07/31 Javascript
js获取指定日期周数以及星期几的小例子
2014/06/27 Javascript
提高NodeJS中SSL服务的性能
2014/07/15 NodeJs
扩展jquery easyui tree的搜索树节点方法(推荐)
2016/10/28 Javascript
js仿拉勾网首页穿墙广告效果
2017/03/08 Javascript
vue+axios实现登录拦截的实例代码
2017/05/22 Javascript
实例讲解Vue.js中router传参
2018/04/22 Javascript
bootstrap里bootstrap动态加载下拉框的实例讲解
2018/08/10 Javascript
Vue常见面试题整理【值得收藏】
2018/09/20 Javascript
跟老齐学Python之dict()的操作方法
2014/09/24 Python
解决python matplotlib imshow无法显示的问题
2018/05/24 Python
Django 多语言教程的实现(i18n)
2018/07/07 Python
让Django的BooleanField支持字符串形式的输入方式
2020/05/20 Python
基于CSS3 animation动画属性实现轮播图效果
2017/09/12 HTML / CSS
Vero Moda西班牙官方购物网站:丹麦BESTSELLER旗下知名女装品牌
2018/04/27 全球购物
一套C++笔试题面试题
2012/06/06 面试题
供应链金融服务方案
2014/05/25 职场文书
IT工程师岗位职责
2014/07/04 职场文书
司机工作自我鉴定
2014/09/19 职场文书
九华山导游词
2015/02/03 职场文书
2015年仓库工作总结
2015/04/09 职场文书
2015年小学总务工作总结
2015/07/21 职场文书
经销商会议开幕词
2016/03/04 职场文书