zoukankan      html  css  js  c++  java
  • PHP : Reflection API

    PHP Reflection API是PHP5才有的新功能,它是用来导出或提取出关于类、方法、属性、参数等的详细信息,包括注释。

    PHP Reflection 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 { }

    具体API说明:

    ①Reflection类

    <?php
    class Reflection
    {
      public static mixed export(Reflector r [,bool return])
      //导出一个类或方法的详细信息
      public static array getModifierNames(int modifiers)
      //取得修饰符的名字
    }
    ?>
    View Code

      

    ②ReflectionException类

    该类继承标准类,没特殊方法和属性。

    ③ReflectionFunction类

    <?php
    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()
      //取得该方法所需的参数个数
    }
    ?>
    View Code

    ④ReflectionParameter类:

    <?php
    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()
      //取得该参数的默认值
    }
    ?>
    View Code

    ⑤ReflectionClass类:

    <?php
    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()
    }
    ?>
    View Code

      

    ⑥ReflectionMethod类:

    <?php
    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()
    }
    ?>
    View Code

    ⑦ReflectionProperty类:

    <?php
    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()
      //取得该属性的注释
    }
    ?>
    View Code

      

    ⑧ReflectionExtension类

    <?php
    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()
    }
     
    ?>
    View Code

      

    使用例子:

    <?php
    class Person{
     private $_name;
      
     public $age;
      
     public function __construct(){
     $this->sex = "male";
     }
      
     public function action(){
     echo "来自http://www.jb51.net的测试";
     }
    }
      
    $class = new ReflectionClass('Person');
    //获取属性
    foreach($class->getProperties() as $property) {
      echo $property->getName()."
    ";
    }
    //获取方法
    print_r($class->getMethods());
      
    $p1 = new Person();
    $obj = new ReflectionObject($p1);
      
    //获取对象和类的属性
    print_r($obj->getProperties());

    很明显上面代码中对象和类获取的属性是不同的,这是因为对象进行了contruct实例化,因此多了sex属性,PHP Reflection确实能够获取很多有用的信息。

  • 相关阅读:
    HTML5课程
    css3兼容代码
    动画
    css3学习笔记(一)
    3d旋转
    Windows安装IIS后,启动网站报错:不能在此路径中使用此配置节……
    AngularJs1.X学习--路由
    Angular学习笔记 ——input 标签上的【name属性】和【ngModelOptions属性】
    Angular学习笔记【ngx-bootstrap】中的 tabset
    TFS 签入时,提示“变更集注释策略 中的内部错误……”
  • 原文地址:https://www.cnblogs.com/KeenLeung/p/6041277.html
Copyright © 2011-2022 走看看