浅谈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 getsiteurl()函数
Sep 05 PHP
PHP 数组排序方法总结 推荐收藏
Jun 30 PHP
PHP学习笔记之二 php入门知识
Jan 12 PHP
基于Zend的Captcha机制的应用
May 02 PHP
php单例模式实现方法分析
Mar 14 PHP
WordPress主题制作中自定义头部的相关PHP函数解析
Jan 08 PHP
PHP开发中常用的十个代码样例
Feb 02 PHP
Docker 如何布置PHP开发环境
Jun 21 PHP
Yii框架中jquery表单验证插件用法示例
Oct 18 PHP
php检查函数必传参数是否存在的实例详解
Aug 28 PHP
PHP远程连接oracle数据库操作实现方法图文详解
Apr 11 PHP
使用PHP开发留言板功能
Nov 19 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_Flame(Version:Progress)的原代码
2006/10/09 PHP
php开发文档 会员收费1期
2012/08/14 PHP
php脚本运行时的超时机制详解
2016/02/17 PHP
Linux下快速搭建php开发环境
2017/03/13 PHP
JS去除字符串的空格增强版(可以去除中间的空格)
2009/08/26 Javascript
基于jquery的跨域调用文件
2010/11/19 Javascript
js写一个字符串转成驼峰的实例
2013/06/21 Javascript
JS中使用Array函数shift和pop创建可忽略参数的例子
2014/05/28 Javascript
javascript相关事件的几个概念
2015/05/21 Javascript
js弹出对话框方式小结
2015/11/17 Javascript
jquery判断密码强度的验证代码
2020/04/22 Javascript
JavaScript SHA-256加密算法详细代码
2016/10/06 Javascript
Angular 4.x+Ionic3踩坑之Ionic3.x pop反向传值详解
2018/03/13 Javascript
vue实现城市列表选择功能
2018/07/16 Javascript
微信小程序实现点击图片放大预览
2019/10/21 Javascript
webpack4 optimization使用总结
2019/11/10 Javascript
js实现课堂随机点名系统
2019/11/21 Javascript
详解Vue中的MVVM原理和实现方法
2020/07/15 Javascript
vue data对象重新赋值无效(未更改)的解决方式
2020/07/24 Javascript
javascript canvas实现简易时钟例子
2020/09/05 Javascript
用Python编写分析Python程序性能的工具的教程
2015/04/01 Python
使用Python读写及压缩和解压缩文件的示例
2016/07/08 Python
django1.8使用表单上传文件的实现方法
2016/11/04 Python
Python定时任务随机时间执行的实现方法
2019/08/14 Python
python不使用for计算两组、多个矩形两两间的iou方式
2020/01/18 Python
python模块如何查看
2020/06/16 Python
Python selenium键盘鼠标事件实现过程详解
2020/07/28 Python
Python 多进程、多线程效率对比
2020/11/19 Python
英国领先的珍珠首饰品牌:Orchira
2016/09/11 全球购物
卡骆驰新加坡官网:Crocs新加坡
2018/06/12 全球购物
伦敦一卡通:The London Pass
2018/11/30 全球购物
车间操作工岗位职责
2013/12/19 职场文书
英文推荐信格式范文
2014/05/09 职场文书
2014年超市员工工作总结
2014/11/18 职场文书
2016年九九重阳节活动总结
2016/04/01 职场文书
CSS实现渐变色边框(Gradient borders)的5种方法
2022/03/25 HTML / CSS