浅谈PHP的反射机制_php基础

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反射机制、php反射机制的作用、php的反射机制、php 类反射机制、java反射机制,以便于您获取更多的相关知识。

时间: 2024-09-20 07:50:59

浅谈PHP的反射机制_php基础的相关文章

NEC参加CCS云计算高峰论坛,浅谈大数据的应用和基础

5月16日,中国云计算领域两大最高端实战.权威专业的云盛会之一的CCS云计算高峰论坛在京召开.NEC(中国)有限公司软件销售部部长李勇在"CCS云计算高峰论坛"上,发表了"浅谈大数据的应用和基础"的主题演讲,介绍了NEC在大数据方面的研究和举措,有听众当场表示受益匪浅,希望与NEC深入交流. 大数据时代的背景 近年来,随着互联网.智能手机及传感器等的普及,信息流量有了爆发性的增长,根据GreenIT协议会统计,2025年,社会的信息量将猛增至2006年的200倍.越

浅谈js基本数据类型和typeof_基础知识

JavaScript数据类型是非常简洁的,它只定义了6中基本数据类型 •null:空.无.表示不存在,当为对象的属性赋值为null,表示删除该属性 •undefined:未定义.当声明变量却没有赋值时会显示该值.可以为变量赋值为undefined •number:数值.最原始的数据类型,表达式计算的载体 •string:字符串.最抽象的数据类型,信息传播的载体 •boolean:布尔值.最机械的数据类型,逻辑运算的载体 •object:对象.面向对象的基础 #当弹出一个变量时: var aa;a

浅谈ASP.NET内部机制(八)

前言:之前几篇文章写了有关视图的知识,也讲述了如何实现IStateManager接口.本篇将讲解如何实 现自定义转换器.当然了,有大量的代码演示!本篇算是有关视图机制的终结篇,还会讲解有关 ControlStatel控件状态的实现. 有个小插曲,其实之前我已经把文章写了一大半,不知道怎么回事,IE出了问题,自动关闭了,真是 心痛阿,现在得重写一遍.我想每个写博文的朋友都有这样的经历吧,写一篇文章真的很不容易! 在上篇中,我们讲解了如何在一个自定义控件中保存自定义类的属性,我现在再次把代码贴出来,

浅谈ASP.NET内部机制(七)

前言:本篇讲解与视图ViewState相关的知识,包括IStateManager,自定义转换器TypeConvert,以及和 视图功能相同的控件状态.可以说本篇是对保存状态有关知识的总结,代码也详细的给出. 自从上次写了有关视图的文章后,收到了很多朋友的邮件,很感谢大家的支持:)很多朋友都说要求 说说实践性更强的东西,所以本篇就进一步的来谈谈视图(不仅仅只是视图,而且在ASP.NET中的状态保 存的话题).首先希望大家对自定义控件有一定的了解.大家可以去参看我的控件开发系列. 首先我看从一个简单

浅谈ASP.NET内部机制(六)

前言:大家都听说过也用过ASP.NET中的视图ViewState,到底ViewState本质上到底是什么东西?为什 么ASP.NET中没有他不行?下面就来谈谈... 我们一般在开发面向对象程序的时候,我们都是用对象保存数据的,比如用对象的属性,字段来保存 对象的状态.当调用对象的方法时,就可以改变对象的状态.释放对象后,对象的状态就消失.这点大家 都熟悉.在开发桌面程序的时候,没有什么问题,以为对象都一般在本地的内存中,直到不再用那个对象 ,我们就销毁它.但是在Web程序中,问题就大了,比如我们

浅谈ASP.NET内部机制(五)

前言:本章要谈页面生命周期了,过程挺多的,但是一点都不难.不信可以看看.我尽量的讲的平实 一些,而且理解页面的生命周期对喜欢开发自定义控件和组件的朋友是很有帮助的. 页面生命周期,也就是处理一个页面请求的过程.我们之前就说过了的,不同文件的由不同的处理程 序来处理.而且处理程序都是实现了IHttpHandler接口.这个接口中有两个方法,其中真正用来处理请求 的就是ProcessRequest方法. 所以当我们请求一个页面的时候,我们的页面,假如我们请求的是default.aspx这个页面是继承

浅谈HTML5 WebSocket的机制

回顾上一章       在上一章<为什么我们需要HTML5 WebSocket>中,我简单的介绍了下WebSocket的前世今生.相信大家已对WebSocket有了初步的了解.那么今天我们继续深入学习WebSocket的机制. WebSocket机制 我们知道WebSocket是HTML5一种新的协议.它实现了浏览器与服务器全双工通信(不知道的可以看下全双工通信RS-422标准),能更好的节省服务器资源和带宽并达到实时通讯,它建立在TCP之上,同HTTP一样通过TCP来传输数据,但是它和HTT

浅谈Ajax的缓存机制_AJAX相关

Ajax的缓存机制和浏览器处理资源时的缓存机制是一样的. 三条简单规则: 只要是URL相同的GET请求,浏览器会使用缓存(当然还要看服务器的Cache-Control/Expires/Last-Modified/ETag头的设置). 只要是POST请求,浏览器都不会缓存. Https的请求,浏览器不会缓存(绝大数情况如此,但是也有例外,据说FF浏览器是例外). 补充: 在URL中拼入随机的查询字符串可以使浏览器认为这是一个新的请求,从而不使用缓存. 在Ajax的请求中设置Http头: If-Mo

浅谈COOKIE和SESSION区别_php技巧

一.cookie介绍 cookie 常用于识别用户.cookie 是服务器留在用户计算机中的小文件.每当相同的计算机通过浏览器请求页面时,它同时会发送 cookie.通过 PHP,您能够创建并取回 cookie 的值. 1.设置Cookie PHP用SetCookie函数来设置Cookie. SetCookie函数定义了一个Cookie,并且把它附加在HTTP头的后面,SetCookie函数的原型如下: int SetCookie(string name, string value, int e