php 反射(好多资料都没有解释)
转载:http://blog.sina.com.cn/s/blog_5674da320100jze1.html (作者:the_least_error)
1。用途:
该扩展分析php程序,导出或提取出关于类、方法、属性、参数等的详细信息,包括注释。
Reflection可以说是对php库函数:“Classes/Objects 类/对象函数”的一个扩展。
主要用在通过程序检测现有php程序内部关于类、方法等信息,并做出处理。
2。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 { }
3。详细说明:(例子详见php手册)
①Reflection类
<?php
class Reflection
{
publicstatic mixed export(Reflector r [,bool return])
//导出一个类或方法的详细信息
publicstatic array getModifierNames(int modifiers)
//取得修饰符的名字
}
?>
②ReflectionException类
该类继承标准类,没特殊方法和属性。
③ReflectionFunction类
<?php
class ReflectionFunction implements Reflector
{
finalprivate __clone()
publicobject __construct(string name)
publicstring __toString()
publicstatic string export()
//导出该函数的详细信息
publicstring getName()
//取得函数名
public boolisInternal()
//测试是否为系统内部函数
public boolisUserDefined()
//测试是否为用户自定义函数
publicstring getFileName()
//取得文件名,包括路径名
public intgetStartLine()
//取得定义函数的起始行
public intgetEndLine()
//取得定义函数的结束行
publicstring getDocComment()
//取得函数的注释
public arraygetStaticVariables()
//取得静态变量
public mixedinvoke(mixed* args)
//调用该函数,通过参数列表传参数
public mixedinvokeArgs(array args)
//调用该函数,通过数组传参数
public boolreturnsReference()
//测试该函数是否返回引用
publicReflectionParameter[] getParameters()
//取得该方法所需的参数,返回值为对象数组
public intgetNumberOfParameters()
//取得该方法所需的参数个数
public intgetNumberOfRequiredParameters()
//取得该方法所需的参数个数
}
?>
④ReflectionParameter类:
<?php
class ReflectionParameter implements Reflector
{
finalprivate __clone()
publicobject __construct(string name)
publicstring __toString()
publicstatic string export()
//导出该参数的详细信息
publicstring getName()
//取得参数名
public boolisPassedByReference()
//测试该参数是否通过引用传递参数
publicReflectionClass getClass()
//若该参数为对象,返回该对象的类名
public boolisArray()
//测试该参数是否为数组类型
public boolallowsNull()
//测试该参数是否允许为空
public boolisOptional()
//测试该参数是否为可选的,当有默认参数时可选
public boolisDefaultValueAvailable()
//测试该参数是否为默认参数
public mixedgetDefaultValue()
//取得该参数的默认值
}
?>
⑤ReflectionClass类:
<?php
class ReflectionClass implements Reflector
{
finalprivate __clone()
publicobject __construct(string name)
publicstring __toString()
publicstatic string export()
//导出该类的详细信息
publicstring getName()
//取得类名或接口名
public boolisInternal()
//测试该类是否为系统内部类
public boolisUserDefined()
//测试该类是否为用户自定义类
public boolisInstantiable()
//测试该类是否被实例化过
public boolhasConstant(string name)
//测试该类是否有特定的常量
public boolhasMethod(string name)
//测试该类是否有特定的方法
public boolhasProperty(string name)
//测试该类是否有特定的属性
publicstring getFileName()
//取得定义该类的文件名,包括路径名
public intgetStartLine()
//取得定义该类的开始行
public intgetEndLine()
//取得定义该类的结束行
publicstring getDocComment()
//取得该类的注释
publicReflectionMethod getConstructor()
//取得该类的构造函数信息
publicReflectionMethod getMethod(string name)
//取得该类的某个特定的方法信息
publicReflectionMethod[] getMethods()
//取得该类的所有的方法信息
publicReflectionProperty getProperty(string name)
//取得某个特定的属性信息
publicReflectionProperty[] getProperties()
//取得该类的所有属性信息
public arraygetConstants()
//取得该类所有常量信息
public mixedgetConstant(string name)
//取得该类特定常量信息
publicReflectionClass[] getInterfaces()
//取得接口类信息
public boolisInterface()
//测试该类是否为接口
public boolisAbstract()
//测试该类是否为抽象类
public boolisFinal()
//测试该类是否声明为final
public intgetModifiers()
//取得该类的修饰符,返回值类型可能是个资源类型
//通过Reflection::getModifierNames($class->getModifiers())进一步读取
public boolisInstance(stdclass object)
//测试传入的对象是否为该类的一个实例
publicstdclass newInstance(mixed* args)
//创建该类实例
publicReflectionClass getParentClass()
//取得父类
public boolisSubclassOf(ReflectionClass class)
//测试传入的类是否为该类的父类
public arraygetStaticProperties()
//取得该类的所有静态属性
public mixedgetStaticPropertyValue(string name [, mixed default])
//取得该类的静态属性值,若private,则不可访问
public voidsetStaticPropertyValue(string name, mixed value)
//设置该类的静态属性值,若private,则不可访问,有悖封装原则
public arraygetDefaultProperties()
//取得该类的属性信息,不含静态属性
public boolisIterateable()
public boolimplementsInterface(string name)
//测试是否实现了某个特定接口
publicReflectionExtension getExtension()
publicstring getExtensionName()
}
?>
⑥ReflectionMethod类:
<?php
class ReflectionMethod extends ReflectionFunction
{
public__construct(mixed class, string name)
publicstring __toString()
publicstatic string export()
//导出该方法的信息
public mixedinvoke(stdclass object, mixed* args)
//调用该方法
public mixedinvokeArgs(stdclass object, array args)
//调用该方法,传多参数
public boolisFinal()
//测试该方法是否为final
public boolisAbstract()
//测试该方法是否为abstract
public boolisPublic()
//测试该方法是否为public
public boolisPrivate()
//测试该方法是否为private
public boolisProtected()
//测试该方法是否为protected
public boolisStatic()
//测试该方法是否为static
public boolisConstructor()
//测试该方法是否为构造函数
public boolisDestructor()
//测试该方法是否为析构函数
public intgetModifiers()
//取得该方法的修饰符
publicReflectionClass getDeclaringClass()
//取得该方法所属的类
// Inheritedfrom ReflectionFunction
finalprivate __clone()
publicstring getName()
public boolisInternal()
public boolisUserDefined()
publicstring getFileName()
public intgetStartLine()
public intgetEndLine()
publicstring getDocComment()
public arraygetStaticVariables()
public boolreturnsReference()
publicReflectionParameter[] getParameters()
public intgetNumberOfParameters()
public intgetNumberOfRequiredParameters()
}
?>
⑦ReflectionProperty类:
<?php
class ReflectionProperty implements Reflector
{
finalprivate __clone()
public__construct(mixed class, string name)
publicstring __toString()
publicstatic string export()
//导出该属性的详细信息
publicstring getName()
//取得该属性名
public boolisPublic()
//测试该属性名是否为public
public boolisPrivate()
//测试该属性名是否为private
public boolisProtected()
//测试该属性名是否为protected
public boolisStatic()
//测试该属性名是否为static
public boolisDefault()
public intgetModifiers()
//取得修饰符
public mixedgetValue(stdclass object)
//取得该属性值
public voidsetValue(stdclass object, mixed value)
//设置该属性值
publicReflectionClass getDeclaringClass()
//取得定义该属性的类
publicstring getDocComment()
//取得该属性的注释
}
?>
⑧ReflectionExtension类
<?php
class ReflectionExtension implements Reflector {
finalprivate __clone()
public__construct(string name)
publicstring __toString()
publicstatic string export()
//导出该扩展的所有信息
publicstring getName()
//取得该扩展的名字
publicstring getVersion()
//取得该扩展的版本
publicReflectionFunction[] getFunctions()
//取得该扩展的所有函数
public arraygetConstants()
//取得该扩展的所有常量
public arraygetINIEntries()
//取得与该扩展相关的,在php.ini中的指令信息
publicReflectionClass[] getClasses()
public arraygetClassNames()
}
?>
4。附:
其实从第二点API概览可以看出:接口挺好用的。
一方面Reflector接口为Reflection小系统提供了一个很好的接口命名规范,
每个实现他的类都须按他的规范,从外部看来,这个小系统API很统一。
另一方面由于很多类实现了Reflector接口,
在这样的类层次结构中,若想实现多态是很容易的。