强大的PHP反射机制

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接口,
在这样的类层次结构中,若想实现多态是很容易的。


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值