PHP反射ReflectionClass、ReflectionMethod 入门教程

作者:SNSGOU 发布于:2014-03-16 16:44:00  分类:PHP   浏览(6145)

PHP5 具有完整的反射API,添加对类、接口、函数、方法和扩展进行反向工程的能力。

反射是什么?

它是指在PHP运行状态中,扩展分析PHP程序,导出或提取出关于类、方法、属性、参数等的详细信息,包括注释。这种动态获取的信息以及动态调用对象的方法的功能称为反射API。反射是操纵面向对象范型中元模型的API,其功能十分强大,可帮助我们构建复杂,可扩展的应用。

其用途如:自动加载插件,自动生成文档,甚至可用来扩充PHP语言。

PHP反射api由若干类组成,可帮助我们用来访问程序的元数据或者同相关的注释交互。借助反射我们可以获取诸如类实现了那些方法,创建一个类的实例(不同于用new创建),调用一个方法(也不同于常规调用),传递参数,动态调用类的静态方法。

反射api是PHP内建的OOP技术扩展,包括一些类,异常和接口,综合使用他们可用来帮助我们分析其它类,接口,方法,属性,方法和扩展。这些OOP扩展被称为反射。

平常我们用的比较多的是 ReflectionClass类 和 ReflectionMethod类,例如:

01 <?php
02 class Person {
03  
04     /**
05      * For the sake of demonstration, we"re setting this private
06      */
07     private $_allowDynamicAttributes = false;
08  
09     /**
10      * type=primary_autoincrement
11      */
12     protected $id = 0;
13  
14     /**
15      * type=varchar length=255 null
16      */
17     protected $name;
18  
19     /**
20      * type=text null
21      */
22     protected $biography;
23  
24     public function getId() {
25         return $this->id;
26     }
27  
28     public function setId($v) {
29         $this->id = $v;
30     }
31  
32     public function getName() {
33         return $this->name;
34     }
35  
36     public function setName($v) {
37         $this->name = $v;
38     }
39  
40     public function getBiography() {
41         return $this->biography;
42     }
43  
44     public function setBiography($v) {
45         $this->biography = $v;
46     }
47 }

一、通过ReflectionClass,我们可以得到Person类的以下信息:

  1. 常量 Contants
  2. 属性 Property Names
  3. 方法 Method Names静态
  4. 属性 Static Properties
  5. 命名空间 Namespace
  6. Person类是否为final或者abstract
  7. Person类是否有某个方法

接下来反射它,只要把类名"Person"传递给ReflectionClass就可以了:

1 $class new ReflectionClass('Person'); // 建立 Person这个类的反射类 
2 $instance  $class->newInstanceArgs($args); // 相当于实例化Person 类

1)获取属性(Properties):

1 $properties $class->getProperties();
2 foreach ($properties as $property) {
3     echo $property->getName() . "\n";
4 }
5 // 输出:
6 // _allowDynamicAttributes
7 // id
8 // name
9 // biography

默认情况下,ReflectionClass会获取到所有的属性,private 和 protected的也可以。如果只想获取到private属性,就要额外传个参数:

1 $private_properties $class->getProperties(ReflectionProperty::IS_PRIVATE);

可用参数列表:

  • ReflectionProperty::IS_STATIC
  • ReflectionProperty::IS_PUBLIC
  • ReflectionProperty::IS_PROTECTED
  • ReflectionProperty::IS_PRIVATE

通过$property->getName()可以得到属性名。

2)获取注释:

通过getDocComment可以得到写给property的注释。

01 foreach ($properties as $property) {
02     if ($property->isProtected()) {
03         $docblock $property->getDocComment();
04         preg_match('/ type\=([a-z_]*) /'$property->getDocComment(), $matches);
05         echo $matches[1] . "\n";
06     }
07 }
08 // Output:
09 // primary_autoincrement
10 // varchar
11 // text

3)获取类的方法

  • getMethods()       来获取到类的所有methods。
  • hasMethod(string)  是否存在某个方法
  • getMethod(string)  获取方法

4)执行类的方法:

1 $instance->getName(); // 执行Person 里的方法getName
2 // 或者:
3 $method $class->getmethod('getName');  // 获取Person 类中的getName方法
4 $method->invoke($instance);              // 执行getName 方法
5 // 或者:
6 $method $class->getmethod('setName');  // 获取Person 类中的setName方法
7 $method->invokeArgs($instancearray('snsgou.com'));

二、通过ReflectionMethod,我们可以得到Person类的某个方法的信息:

  1. 是否“public”、“protected”、“private” 、“static”类型
  2. 方法的参数列表
  3. 方法的参数个数
  4. 反调用类的方法
1 // 执行detail方法
2 $method new ReflectionMethod('Person''test');
3  
4 if ($method->isPublic() && !$method->isStatic()) {
5     echo 'Action is right';
6 }
7 echo $method->getNumberOfParameters(); // 参数个数
8 echo $method->getParameters(); // 参数对象数组

PHP反射ReflectionClass、ReflectionMethod 入门教程的更多相关文章

  1. Groovy入门教程

    Groovy入门教程 kmyhy@126.com  2009-5-13 一.groovy是什么 简单地说,Groovy 是下一代的java语言,跟java一样,它也运行在 JVM 中. 作为跑在JVM ...

  2. spring boot入门教程——Spring Boot快速入门指南

    Spring Boot已成为当今最流行的微服务开发框架,本文是如何使用Spring Boot快速开始Web微服务开发的指南,我们将使创建一个可运行的包含内嵌Web容器(默认使用的是Tomcat)的可运 ...

  3. WebRTC 入门教程(二)| WebRTC信令控制与STUN/TURN服务器搭建

    WebRTC 入门教程(二)| WebRTC信令控制与STUN/TURN服务器搭建 四月 4, 2019 作者:李超,音视频技术专家.本文首发于 RTC 开发者社区,欢迎在社区留言与作者交流. htt ...

  4. vue项目中使用ts(typescript)入门教程

    最近项目需要将原vue项目结合ts的使用进行改造,这个后面应该是中大型项目的发展趋势,看到一篇不错的入门教程,结合它并进行了一点拓展记录之.本文从安装到vue组件编写进行了说明,适合入门. 1.引入T ...

  5. wepack+sass+vue 入门教程(三)

    十一.安装sass文件转换为css需要的相关依赖包 npm install --save-dev sass-loader style-loader css-loader loader的作用是辅助web ...

  6. wepack+sass+vue 入门教程(二)

    六.新建webpack配置文件 webpack.config.js 文件整体框架内容如下,后续会详细说明每个配置项的配置 webpack.config.js直接放在项目demo目录下 module.e ...

  7. wepack+sass+vue 入门教程(一)

    一.安装node.js node.js是基础,必须先安装.而且最新版的node.js,已经集成了npm. 下载地址 node安装,一路按默认即可. 二.全局安装webpack npm install ...

  8. Content Security Policy 入门教程

    阮一峰文章:Content Security Policy 入门教程

  9. gulp详细入门教程

    本文链接:http://www.ydcss.com/archives/18 gulp详细入门教程 简介: gulp是前端开发过程中对代码进行构建的工具,是自动化项目的构建利器:她不仅能对网站资源进行优 ...

随机推荐

  1. ie6下a标签的onclick事件不执行问题解决方案

    <a href="javascript:void(0)" onclick="loadiframe()">点我咯</a> <scri ...

  2. mysql的“Got error 28 from storage engine”错误

    磁盘临时空间不够导致.解决办法:清空/tmp目录,或者修改my.cnf中的tmpdir参数,指向具有足够空间目录

  3. cookie丢失、登陆自动退出问题解决

    cookie保存在客户端或者内存中,不易丢失.但是在某些情况下会被忽略.在项目过程中遇到过跨域丢失的情况.在VS里面运行的程序,产生的cookie默认是没有domain值的,但是给它设定domain值 ...

  4. Android-------- AlertDialog中EditText无法弹出输入法的解决

    文章转自:http://21jhf.iteye.com/blog/2007375: 如果AlertDialog中有编辑录入框(newMainLayout里面动态创建了EditText控件),show后 ...

  5. ActiveMQ持久化消息(转)

    ActiveMQ的另一个问题就是只要是软件就有可能挂掉,挂掉不可怕,怕的是挂掉之后把信息给丢了,所以本节分析一下几种持久化方式: 一.持久化为文件 ActiveMQ默认就支持这种方式,只要在发消息时设 ...

  6. The Letter Carrier's Rounds(摘)

    Description For an electronic mail application you are to describe the SMTP-based communication that ...

  7. UVALive 4119 Always an integer (差分数列,模拟)

    转载请注明出处: http://www.cnblogs.com/fraud/          ——by fraud Always an integer Time Limit:3000MS     M ...

  8. (原)Ubuntu14中安装GraphicsMagick

    转载请注明出处: http://www.cnblogs.com/darkknightzh/p/5661439.html 参考网址: http://comments.gmane.org/gmane.co ...

  9. TextView之一:子类的常用属性

    TextView常见的子类包括EditText,Button,CheckBox, RadioButton等. 1.EditText EditText继承自TextView,因此TextView所有属性 ...

  10. jQuery 改变Form 指向的 Action

    var path = "shiftCancelAction"; $('#queryForm').attr("action",path).submit();