PHP反射

        反射机制

          面向对象的编程中对象被赋予了自省的能力,而这个自省的过程就是反射。通过使用反射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;
    }

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值