浅谈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 目录遍历、删除 函数的使用介绍
Apr 28 PHP
PHP 线程安全与非线程安全版本的区别深入解析
Aug 06 PHP
PHP程序员必须清楚的问题汇总
Dec 18 PHP
php实现word转html的方法
Jan 22 PHP
phpinfo() 中 Local Value(局部变量)Master Value(主变量) 的区别
Feb 03 PHP
深入理解PHP之OpCode原理详解
Jun 01 PHP
PHP实现网站访问量计数器
Oct 27 PHP
PHP设计模式之装饰器模式实例详解
Feb 07 PHP
PHP-FPM的配置与优化讲解
Mar 15 PHP
PHP中localeconv()函数的用法
Mar 26 PHP
PHP工厂模式、单例模式与注册树模式实例详解
Jun 03 PHP
WordPress免插件实现面包屑导航的示例代码
Aug 20 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 json格式和js json格式 js跨域调用实现代码
2012/09/08 PHP
ThinkPHP跳转页success及error模板实例教程
2014/07/17 PHP
php解析xml方法实例详解
2015/05/12 PHP
Laravel框架生命周期与原理分析
2018/06/12 PHP
如何在centos8自定义目录安装php7.3
2019/11/28 PHP
ExtJS 学习专题(一) 如何应用ExtJS(附实例)
2010/03/11 Javascript
用JQuery实现表格隔行变色和突出显示当前行的代码
2012/02/10 Javascript
前端必备神器 Snap.svg 弹动效果
2014/11/10 Javascript
jQuery实现的网页竖向菜单效果代码
2015/08/26 Javascript
全面接触神奇的Bootstrap导航条实战篇
2016/08/01 Javascript
jQuery多文件异步上传带进度条实例代码
2016/08/16 Javascript
通过修改360抢票的刷新频率和突破8车次限制实现方法
2017/01/04 Javascript
JavaScript轮播图简单制作方法
2017/02/20 Javascript
详解Node.js 命令行程序开发教程
2017/06/07 Javascript
nodeJS(express4.x)+vue(vue-cli)构建前后端分离实例(带跨域)
2017/07/05 NodeJs
Angular限制input框输入金额(是小数的话只保留两位小数点)
2017/07/13 Javascript
vue项目部署到Apache服务器中遇到的问题解决
2018/08/24 Javascript
JavaScript 扩展运算符用法实例小结【基于ES6】
2019/06/17 Javascript
webpack 处理CSS资源的实现
2019/09/27 Javascript
JS使用for in有序获取对象数据
2020/05/19 Javascript
[57:16]2014 DOTA2华西杯精英邀请赛 5 25 LGD VS VG第二场
2014/05/26 DOTA
[04:02]2014DOTA2国际邀请赛 BBC每日综述中国战队将再度登顶
2014/07/21 DOTA
浅谈对python中if、elif、else的误解
2020/08/20 Python
Django多个app urls配置代码实例
2020/11/26 Python
Lookfantastic葡萄牙官方网站:欧洲第一大化妆品零售商
2018/03/17 全球购物
eBay奥地利站:eBay.at
2019/07/24 全球购物
DJI全球:DJI Global
2021/03/15 全球购物
配件采购员岗位职责
2013/12/03 职场文书
个人职业生涯规划书1500字
2013/12/31 职场文书
计算机科学技术自荐信
2014/06/12 职场文书
小学趣味运动会加油稿
2014/09/25 职场文书
出差报告格式模板
2014/11/06 职场文书
大学生支教感言
2015/08/01 职场文书
入党宣誓大会后的感想
2015/08/10 职场文书
教你怎么用python selenium实现自动化测试
2021/05/27 Python
详解Spring Security如何在权限中使用通配符
2022/06/28 Java/Android