浅谈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变量引用的面试题
Aug 08 PHP
php 短链接算法收集与分析
Dec 30 PHP
支持中文和其他编码的php截取字符串函数分享(截取中文字符串)
Mar 13 PHP
PHP实现的连贯操作、链式操作实例
Jul 08 PHP
php获取访问者IP地址汇总
Apr 24 PHP
WampServer搭建php环境时遇到的问题汇总
Jul 23 PHP
大家在抢红包,程序员在研究红包算法
Aug 31 PHP
php实现压缩合并js的方法【附demo源码下载】
Sep 22 PHP
Laravel实现表单提交
May 07 PHP
PHP下 Mongodb 连接远程数据库的实例代码
Aug 30 PHP
PHP实现打包下载文件的方法示例
Oct 07 PHP
PHP封装的验证码工具类定义与用法示例
Aug 22 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的面向对象编程
2006/10/09 PHP
php+mysql写的简单留言本实例代码
2008/07/25 PHP
PHP服务器页面间跳转实现方法
2012/08/02 PHP
ThinkPHP视图查询详解
2014/06/30 PHP
JS getStyle获取最终样式函数代码
2010/04/01 Javascript
js+JQuery返回顶部功能如何实现
2012/12/03 Javascript
JavaScript将相对地址转换为绝对地址示例代码
2013/07/19 Javascript
jQuery实现统计输入文字个数的方法
2015/03/11 Javascript
JS高仿抛物线加入购物车特效实现代码
2017/02/20 Javascript
JavaScript原生实现观察者模式的示例
2017/12/15 Javascript
基于Vue-Cli 打包自动生成/抽离相关配置文件的实现方法
2018/12/09 Javascript
Layui选项卡制作历史浏览记录的方法
2019/09/28 Javascript
vue.config.js中配置Vue的路径别名的方法
2020/02/11 Javascript
JS数据类型判断的几种常用方法
2020/07/07 Javascript
uniapp电商小程序实现订单30分钟倒计时
2020/11/01 Javascript
js用正则表达式筛选年月日的实例方法
2021/01/04 Javascript
[43:32]2014 DOTA2华西杯精英邀请赛 5 25 LGD VS NewBee第一场
2014/05/26 DOTA
python中的一些类型转换函数小结
2013/02/10 Python
python用10行代码实现对黄色图片的检测功能
2015/08/10 Python
python Django批量导入数据
2016/03/25 Python
Python利用Beautiful Soup模块修改内容方法示例
2017/03/27 Python
Python 逐行分割大txt文件的方法
2017/10/10 Python
解决Python安装后pip不能用的问题
2018/06/12 Python
详解Python解决抓取内容乱码问题(decode和encode解码)
2019/03/29 Python
Python 无限级分类树状结构生成算法的实现
2021/01/21 Python
Canvas 文字碰撞检测并抽稀的方法
2019/05/27 HTML / CSS
关于h5中的fetch方法解读(小结)
2017/11/15 HTML / CSS
JSF面试题:Jsf中的核心类用那些?有什么作用?LiftCycle六大生命周期是什么?
2014/07/17 面试题
行政助理岗位职责
2013/11/10 职场文书
总经理驾驶员岗位职责
2013/12/04 职场文书
给朋友的道歉信
2014/01/09 职场文书
岗位职责的构建方法
2014/02/01 职场文书
消防应急演练方案
2014/02/12 职场文书
档案信息化建设方案
2014/05/16 职场文书
2014年护理部工作总结
2014/11/14 职场文书
2015年汽车销售经理工作总结
2015/04/27 职场文书