浅谈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 相关文章推荐
如何将数据从文本导入到mysql
Oct 09 PHP
php radio 单选框获取与保持值的实现代码
May 15 PHP
PHP 工厂模式使用方法
May 18 PHP
php读取EXCEL文件 php excelreader读取excel文件
Dec 06 PHP
php读取目录所有文件信息dir示例
Mar 18 PHP
PHP使用ffmpeg给视频增加字幕显示的方法
Mar 12 PHP
Linux系统递归生成目录中文件的md5的方法
Jun 29 PHP
Yii2搭建后台并实现rbac权限控制完整实例教程
Apr 28 PHP
Laravel框架集成UEditor编辑器的方法图文与实例详解
Apr 17 PHP
CentOS7编译安装php7.1的教程详解
Apr 18 PHP
Laravel 登录后清空COOKIE的操作方法
Oct 14 PHP
PHP 对象接口简单实现方法示例
Apr 13 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
基于mysql的bbs设计(五)
2006/10/09 PHP
PHP新手上路(五)
2006/10/09 PHP
PHP浮点数的一个常见问题
2016/03/10 PHP
php 实现进制相互转换
2016/04/07 PHP
PHP实现登录搜狐广告获取广告联盟数据的方法【附demo源码】
2016/10/14 PHP
PHP 对象继承原理与简单用法示例
2020/04/21 PHP
firefox浏览器下javascript 拖动层效果与原理分析代码
2007/12/04 Javascript
js数据验证集合、js email验证、js url验证、js长度验证、js数字验证等简单封装
2010/05/15 Javascript
jQuery实现的立体文字渐变效果
2010/05/17 Javascript
input按钮的事件处理大全
2010/12/10 Javascript
JavaScript高级程序设计 DOM学习笔记
2011/09/10 Javascript
原生javascript实现的ajax异步封装功能示例
2016/11/03 Javascript
jquery实现页面加载效果
2017/02/21 Javascript
jQuery Ajax前后端使用JSON进行交互示例
2017/03/17 Javascript
前端常见跨域解决方案(全)
2017/09/19 Javascript
如何在 JavaScript 中更好地利用数组
2018/09/27 Javascript
vue中轮训器的使用
2019/01/27 Javascript
Vue-cli3.X使用px2 rem遇到的问题及解决方法
2019/08/08 Javascript
js实现图片3D轮播效果
2019/09/21 Javascript
antd vue table跨行合并单元格,并且自定义内容实例
2020/10/28 Javascript
Python sys.path详细介绍
2013/10/17 Python
python33 urllib2使用方法细节讲解
2013/12/03 Python
python解决Fedora解压zip时中文乱码的方法
2016/09/18 Python
Python OpenCV处理图像之滤镜和图像运算
2018/07/10 Python
使用python实现回文数的四种方法小结
2019/11/24 Python
pytorch实现mnist分类的示例讲解
2020/01/10 Python
意大利宠物用品购物网站:Bauzaar
2018/09/15 全球购物
介绍一下EJB的体系结构
2012/08/01 面试题
企业演讲稿范文
2013/12/28 职场文书
企业军训感言
2014/02/08 职场文书
家长会欢迎标语
2014/06/24 职场文书
预备党员转正思想汇报
2014/09/26 职场文书
瘦西湖导游词
2015/02/03 职场文书
结婚通知短信怎么写
2015/04/17 职场文书
Pytorch中的学习率衰减及其用法详解
2021/06/05 Python
基于Python实现流星雨效果的绘制
2022/03/18 Python