PHP的反射类ReflectionClass、ReflectionMethod使用实例

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

反射是什么?

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

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

PHP反射api由若干类组成,可帮助我们用来访问程序的元数据或者同相关的注释交互。借助反射我们可以获取诸如类实现了那些方法,创建一个类的实例(不同于用new创建),调用一个方法(也不同于常规调用),传递参数,动态调用类的静态方法。
反射api是PHP内建的OOP技术扩展,包括一些类,异常和接口,综合使用他们可用来帮助我们分析其它类,接口,方法,属性,方法和扩展。这些OOP扩展被称为反射。

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

<?php
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;
 public function 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;
 }
}

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

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

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

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

1)获取属性(Properties):

$properties = $class->getProperties();
foreach ($properties as $property) {
 echo $property->getName() . "\n";
}
// 输出:
// _allowDynamicAttributes
// id
// name
// biography

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

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

可用参数列表:

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

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

2)获取注释:

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

foreach ($properties as $property) {
 if ($property->isProtected()) {
  $docblock = $property->getDocComment();
  preg_match(‘/ type\=([a-z_]*) /‘, $property->getDocComment(), $matches);
  echo $matches[1] . "\n";
 }
}
// Output:
// primary_autoincrement
// varchar
// text

3)获取类的方法

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

4)执行类的方法:

$instance->getName(); // 执行Person 里的方法getName
// 或者:
$method = $class->getmethod(‘getName‘); // 获取Person 类中的getName方法
$method->invoke($instance);    // 执行getName 方法
// 或者:
$method = $class->getmethod(‘setName‘); // 获取Person 类中的setName方法
$method->invokeArgs($instance, array(‘snsgou.com‘));

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

1.是否“public”、“protected”、“private” 、“static”类型
2.方法的参数列表
3.方法的参数个数
4.反调用类的方法

// 执行detail方法
$method = new ReflectionMethod(‘Person‘, ‘test‘);
if ($method->isPublic() && !$method->isStatic()) {
 echo ‘Action is right‘;
}
echo $method->getNumberOfParameters(); // 参数个数
echo $method->getParameters(); // 参数对象数组
时间: 2024-10-17 05:04:13

PHP的反射类ReflectionClass、ReflectionMethod使用实例的相关文章

php反射类 ReflectionClass

什么是php反射类,顾名思义,能够理解为一个类的映射.举个样例: class fuc {        //定义一个类static function ec() {echo '我是一个类';}}$class=new ReflectionClass('fuc');    //建立 fuc这个类的反射类 echo $class; //输出这反射类 Class [ class A ] { @@ F:\phpweb\myPHP\test.php 23-30 - Constants [0] { } - St

php反射类的使用及Laravel对反射的使用介绍

PHP的反射类与实例化对象作用相反,实例化是调用封装类中的方法.成员,而反射类则是拆封类中的所有方法.成员变量,并包括私有方法等.就如"解刨"一样,我们可以调用任何关键字修饰的方法.成员.当然在正常业务中是建议不使用,比较反射类已经摒弃了封装的概念. 本章讲解反射类的使用及Laravel对反射的使用. 反射 反射类是PHP内部类,无需加载即可使用,你可以通过实例化 ReflectionClass 类去使用它. 方法 这里列举下PHP反射类常用的方法 方法名 注释 ReflectionC

Java反射机制浅析图+应用实例

Java反射机制浅析图+应用实例 --转载请注明出处:coder-pig 本节引言: 其实很久之前就想归纳一下Java中的这个反射机制了,前些天看了慕课网一个讲反射机制的 视频教程觉得不错,又复习了一下,今天面试了一下午,回来就不想写代码了,就写写关于Java 反射的总结,写些简单的使用例子,最后找了2个Android中反射机制应用的例子,分别是 旧版本SDK利用AIDL + Java反射机制接听与挂断电话以及利用反射机制通过按钮关闭 对话框,后续如果用到会另外总结~ 本节正文: 1.反射的相关

Java 反射 类的连接与初始化 [ 转载 ]

Java类的连接与初始化 (及2013阿里初始化笔试题解析) 转自http://www.cnblogs.com/iceAeterNa/p/4876747.html Java虚拟机通过装载.连接.初始化来使得一个Java类型可以被Java程序所使用,如下图所示,其中连接过程又分为验证.准备.解析三个部分.其中部分类的解析过程可以推迟到程序真正使用其某个符号引用时再去解析.   解析过程可以推迟到类的初始化之后再进行,但这是有条件的,Java虚拟机必须在每个类或接口主动使用时进行初始化. 以下为主动

java 反射类的理解与应用

本文主要解析的类是: ClassLodaer,Class,Field,Method,Constructor. 本文的目标很简单,只是对这些常用的反射类进行简单解释.对这些类中常用方法进行介绍. JAVA反射机制是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法:对于任意一个对象,都能够调用它的任意一个方法:这种动态获取的信息以及动态调用对象的方法的功能称为java语言的反射机制.Java反射机制主要提供了以下功能: 在运行时判断任意一个对象所属的类:在运行时构造任意一个类的对象:在

Java Class类以及获取Class实例的三种方式

T - 由此 Class 对象建模的类的类型.例如,String.class 的类型是Class<String>.如果将被建模的类未知,则使用Class<?>. [java] view plain copy print? public final class Class<T> extends Object  implements java.io.Serializable, java.lang.reflect.GenericDeclaration, java.lang.r

反射类的方法(其中main方法比较特殊)

package reflet; import java.util.List; public class person { public String name="hahaah"; public void aa1()//方法 { System.out.println("aa1"); } public void aa1(String name,int password) { System.out.println(name+":"+password);

通过反射创建自定义泛型的实例。

比如有这样一个泛型:Demo.GenericsSimple<T,TT> 我想要通过反射创建一个Demo.GenericsSimple<string,int>的实例可以通过下面的格式进行创建: System.Reflection.Assembly.GetExecutingAssembly().CreateInstance("命名空间.User`形参数量N[[1形参类型全名,形参类型所在的程 序集名称],[2形参类型全名,形参类型所在的程序集名称],[3形参类型全名,形参类型

01_反射_02_反射类的构造方法

[工程截图] [Person.java] //将要被反射的类 package com.Higgin.reflect; import java.util.List; public class Person { private String name="NULL"; private int age=0; public Person(){ System.out.println("构造方法:Person()"); } public Person(String name){