PHP反射
来源:互联网 发布:数据集成市场怎么样 编辑:程序博客网 时间:2024/05/16 07:16
反射机制
面向对象的编程中对象被赋予了自省的能力,而这个自省的过程就是反射。通过使用反射api就能够实现动态的获 取一个类所有属性和方法以及调用该方法和属性. 反射机制使我们可以在动态的过程中获取对象的所在的类、属性、方法、参数、注释、访问权限等。 PHP5添加了一项新的功能:Reflection。这个功能使得程序员可以reverse-engineer class, interface,function,method and extension。通过PHP代码,就可以得到某object的所有信息,并且可以和它交互。
反射API
反射api是php内建的oop技术扩展,包括一些类,异常和接口,综合使用他们可用来帮助我们分析其它类,接口,方法,属性,方法和扩展。这些oop扩展被称为反射。通过反射API我们可以获得。通过反射可以获得以下内容
- 常量 Contants
- 属性 Property Names
- 方法 Method Names静态
- 属性 Static Properties
- 命名空间 Namespace
- 类是否为final或者abstract
- 注释
反射API类和接口
class Reflection { } interface Reflector { } class ReflectionException extends Exception { } class ReflectionFunction implements Reflector { } class ReflectionParameter implements Reflector { } class ReflectionMethod extends ReflectionFunction { } class ReflectionClass implements Reflector { } class ReflectionObject extends ReflectionClass { } class ReflectionProperty implements Reflector { } class ReflectionExtension implements Reflector { }
Reflection
class Reflection { public static mixed export(Reflector r [,bool return]) //导出一个类或方法的详细信息 public static array getModifierNames(int modifiers) //取得修饰符的名字 }
ReflectionFunction
该类继承标准类,没特殊方法和属性。
class ReflectionFunction implements Reflector{ final private __clone() public object __construct(string name) public string __toString() public static string export() //导出该函数的详细信息 public string getName() //取得函数名 public bool isInternal() //测试是否为系统内部函数 public bool isUserDefined() //测试是否为用户自定义函数 public string getFileName() //取得文件名,包括路径名 public int getStartLine() //取得定义函数的起始行 public int getEndLine() //取得定义函数的结束行 public string getDocComment() //取得函数的注释 public array getStaticVariables() //取得静态变量 public mixed invoke(mixed* args) //调用该函数,通过参数列表传参数 public mixed invokeArgs(array args) //调用该函数,通过数组传参数 public bool returnsReference() //测试该函数是否返回引用 public ReflectionParameter[] getParameters() //取得该方法所需的参数,返回值为对象数组 public int getNumberOfParameters() //取得该方法所需的参数个数 public int getNumberOfRequiredParameters() //取得该方法所需的参数个数 }
ReflectionParameter
class ReflectionParameter implements Reflector{ final private __clone() public object __construct(string name) public string __toString() public static string export() //导出该参数的详细信息 public string getName() //取得参数名 public bool isPassedByReference() //测试该参数是否通过引用传递参数 public ReflectionClass getClass() //若该参数为对象,返回该对象的类名 public bool isArray() //测试该参数是否为数组类型 public bool allowsNull() //测试该参数是否允许为空 public bool isOptional() //测试该参数是否为可选的,当有默认参数时可选 public bool isDefaultValueAvailable() //测试该参数是否为默认参数 public mixed getDefaultValue() //取得该参数的默认值 }
ReflectionParameter
class ReflectionClass implements Reflector{ final private __clone() public object __construct(string name) public string __toString() public static string export() //导出该类的详细信息 public string getName() //取得类名或接口名 public bool isInternal() //测试该类是否为系统内部类 public bool isUserDefined() //测试该类是否为用户自定义类 public bool isInstantiable() //测试该类是否被实例化过 public bool hasConstant(string name) //测试该类是否有特定的常量 public bool hasMethod(string name) //测试该类是否有特定的方法 public bool hasProperty(string name) //测试该类是否有特定的属性 public string getFileName() //取得定义该类的文件名,包括路径名 public int getStartLine() //取得定义该类的开始行 public int getEndLine() //取得定义该类的结束行 public string getDocComment() //取得该类的注释 public ReflectionMethod getConstructor() //取得该类的构造函数信息 public ReflectionMethod getMethod(string name) //取得该类的某个特定的方法信息 public ReflectionMethod[] getMethods() //取得该类的所有的方法信息 public ReflectionProperty getProperty(string name) //取得某个特定的属性信息 public ReflectionProperty[] getProperties() //取得该类的所有属性信息 public array getConstants() //取得该类所有常量信息 public mixed getConstant(string name) //取得该类特定常量信息 public ReflectionClass[] getInterfaces() //取得接口类信息 public bool isInterface() //测试该类是否为接口 public bool isAbstract() //测试该类是否为抽象类 public bool isFinal() //测试该类是否声明为final public int getModifiers() //取得该类的修饰符,返回值类型可能是个资源类型 //通过Reflection::getModifierNames($class->getModifiers())进一步读取 public bool isInstance(stdclass object) //测试传入的对象是否为该类的一个实例 public stdclass newInstance(mixed* args) //创建该类实例 public ReflectionClass getParentClass() //取得父类 public bool isSubclassOf(ReflectionClass class) //测试传入的类是否为该类的父类 public array getStaticProperties() //取得该类的所有静态属性 public mixed getStaticPropertyValue(string name [, mixed default]) //取得该类的静态属性值,若private,则不可访问 public void setStaticPropertyValue(string name, mixed value) //设置该类的静态属性值,若private,则不可访问,有悖封装原则 public array getDefaultProperties() //取得该类的属性信息,不含静态属性 public bool isIterateable() public bool implementsInterface(string name) //测试是否实现了某个特定接口 public ReflectionExtension getExtension() public string getExtensionName() }
ReflectionMethod
class ReflectionMethod extends ReflectionFunction{ public __construct(mixed class, string name) public string __toString() public static string export() //导出该方法的信息 public mixed invoke(stdclass object, mixed* args) //调用该方法 public mixed invokeArgs(stdclass object, array args) //调用该方法,传多参数 public bool isFinal() //测试该方法是否为final public bool isAbstract() //测试该方法是否为abstract public bool isPublic() //测试该方法是否为public public bool isPrivate() //测试该方法是否为private public bool isProtected() //测试该方法是否为protected public bool isStatic() //测试该方法是否为static public bool isConstructor() //测试该方法是否为构造函数 public bool isDestructor() //测试该方法是否为析构函数 public int getModifiers() //取得该方法的修饰符 public ReflectionClass getDeclaringClass() //取得该方法所属的类 //Inherited from ReflectionFunction final private __clone() public string getName() public bool isInternal() public bool isUserDefined() public string getFileName() public int getStartLine() public int getEndLine() public string getDocComment() public array getStaticVariables() public bool returnsReference() public ReflectionParameter[] getParameters() public int getNumberOfParameters() public int getNumberOfRequiredParameters() }
ReflectionProperty
class ReflectionProperty implements Reflector{ final private __clone() public __construct(mixed class, string name) public string __toString() public static string export() //导出该属性的详细信息 public string getName() //取得该属性名 public bool isPublic() //测试该属性名是否为public public bool isPrivate() //测试该属性名是否为private public bool isProtected() //测试该属性名是否为protected public bool isStatic() //测试该属性名是否为static public bool isDefault() public int getModifiers() //取得修饰符 public mixed getValue(stdclass object) //取得该属性值 public void setValue(stdclass object, mixed value) //设置该属性值 public ReflectionClass getDeclaringClass() //取得定义该属性的类 public string getDocComment() //取得该属性的注释 }
ReflectionExtension
class ReflectionExtension implements Reflector { final private __clone() public __construct(string name) public string __toString() public static string export() //导出该扩展的所有信息 public string getName() //取得该扩展的名字 public string getVersion() //取得该扩展的版本 public ReflectionFunction[] getFunctions() //取得该扩展的所有函数 public array getConstants() //取得该扩展的所有常量 public array getINIEntries() //取得与该扩展相关的,在php.ini中的指令信息 public ReflectionClass[] getClasses() public array getClassNames() }
反射使用初探
- 获得类信息
$class = new ReflectionClass('Person');
- 获取所有属性
$properties = $class->getProperties(); foreach($properties as $property) { echo $property->getName()."\n"; }
- 获取protected和private属性
$private_properties = $class->getProperties(ReflectionProperty::IS_PRIVATE|ReflectionProperty::IS_PROTECTED);属性访问权限
ReflectionProperty::IS_STATIC ReflectionProperty::IS_PUBLIC ReflectionProperty::IS_PROTECTED ReflectionProperty::IS_PRIVATE
- 获取注释
foreach($properties as $property) { if($property->isProtected()) { $docblock = $property->getDocComment(); preg_match('/ type\=([a-z_]*) /', $property->getDocComment(), $matches); echo $matches[1]."\n"; } }
- 获取实例
$object = $class->newInstance();
反射机制使用示例
/** * 通过反射机制实现返回json数据 * @param $className 类名 * @return array|string */ public function getJson($className = null){ $result = array(); if(isEmpty($className)){ $className = get_called_class(); } $reflector = new \ReflectionClass($className); $properties = $reflector->getProperties(); foreach ($properties as $property) { $propertyName = $property->getName(); $getter = 'get'.ucfirst($propertyName); if (method_exists($this, $getter)) { $propertyValue = $this->$getter(); $result[$propertyName] = $propertyValue; } } return $result; }
1 0
- php反射
- PHP反射
- php反射
- PHP反射
- php 反射
- PHP反射
- php 反射
- PHP--反射
- PHP反射
- PHP反射
- php反射
- php 反射
- php 反射
- php反射
- 1.5反射--php反射学习
- PHP 映射(反射)Reflection
- php反射函数
- PHP API反射实例
- 第八周:C:输出数字
- 【实现&调用】实现可被简单调用的python函数
- js 全选、反选、批删
- 安利一款智联招聘搜索脚本
- Windows下使用Java Jni调用C/C++初探
- PHP反射
- 2016 idea注册码
- DBCP、C3P0、Proxool、BoneCP几种数据源参数介绍
- 详解Copyleft到底是什么?
- rap接口管理工具系统的搭建
- git 使用笔记
- Android—使用Http协议访问网络
- 二叉树的遍历操作
- git版本控制开发流程小结笔记(一)