zoukankan      html  css  js  c++  java
  • php反射机制应用

    用来获取指定的类的信息,包括类中的属性,方法,方法权限,注释等

    用途:1.thinkPHP框架中的前置,后置控制器的实现

    2.与debug_backtrace函数结合使用,文件调用的权限管理

    使用方法:

     1 <?php
     2    class Person {
     3     
     4        /**
     5         * For the sake of demonstration, we"re setting this private
     6         */
     7        private $_allowDynamicAttributes = false;
     8     
     9        /**
    10         * type=primary_autoincrement
    11         */
    12        protected $id = 0;
    13     
    14        /**
    15         * type=varchar length=255 null
    16         */
    17        protected $name;
    18     
    19        /**
    20         * type=text null
    21         */
    22        protected $biography;
    23     
    24        public function getId() {
    25            return $this->id;
    26        }
    27     
    28        public function setId($v) {
    29            $this->id = $v;
    30        }
    31     
    32        public function getName() {
    33            return $this->name;
    34        }
    35     
    36        public function setName($v) {
    37            $this->name = $v;
    38        }
    39     
    40        public function getBiography() {
    41            return $this->biography;
    42        }
    43     
    44        public function setBiography($v) {
    45            $this->biography = $v;
    46        }
    47    }

    一、通过ReflectionClass,我们可以得到Person类的以下信息:

    1. 常量 Contants
    2. 属性 Property Names
    3. 方法 Method Names静态
    4. 属性 Static Properties
    5. 命名空间 Namespace
    6. Person类是否为final或者abstract
    7. Person类是否有某个方法

    接下来反射它,只要把类名"Person"传递给ReflectionClass就可以了:

    1    $class = new ReflectionClass('Person'); // 建立 Person这个类的反射类 
    2    $instance  = $class->newInstanceArgs($args); // 相当于实例化Person 类

    1)获取属性(Properties):

    复制代码
    1    $properties = $class->getProperties();
    2    foreach ($properties as $property) {
    3        echo $property->getName() . "
    ";
    4    }
    5    // 输出:
    6    // _allowDynamicAttributes
    7    // id
    8    // name
    9    // biography
    复制代码

    默认情况下,ReflectionClass会获取到所有的属性,private 和 protected的也可以。如果只想获取到private属性,就要额外传个参数:

    1    $private_properties = $class->getProperties(ReflectionProperty::IS_PRIVATE);

    可用参数列表:

    • ReflectionProperty::IS_STATIC
    • ReflectionProperty::IS_PUBLIC
    • ReflectionProperty::IS_PROTECTED
    • ReflectionProperty::IS_PRIVATE

    通过$property->getName()可以得到属性名。

    2)获取注释:

    通过getDocComment可以得到写给property的注释。 

    复制代码
    01    foreach ($properties as $property) {
    02        if ($property->isProtected()) {
    03            $docblock = $property->getDocComment();
    04            preg_match('/ type=([a-z_]*) /', $property->getDocComment(), $matches);
    05            echo $matches[1] . "
    ";
    06        }
    07    }
    08    // Output:
    09    // primary_autoincrement
    10    // varchar
    11    // text
    复制代码

    3)获取类的方法

    • getMethods()       来获取到类的所有methods。
    • hasMethod(string)  是否存在某个方法
    • getMethod(string)  获取方法

    4)执行类的方法:

    复制代码
    1    $instance->getName(); // 执行Person 里的方法getName
    2    // 或者:
    3    $method = $class->getmethod('getName');  // 获取Person 类中的getName方法
    4    $method->invoke($instance);              // 执行getName 方法
    5    // 或者:
    6    $method = $class->getmethod('setName');  // 获取Person 类中的setName方法
    7    $method->invokeArgs($instance, array('snsgou.com'));
    复制代码

    二、通过ReflectionMethod,我们可以得到Person类的某个方法的信息:

    1. 是否“public”、“protected”、“private” 、“static”类型
    2. 方法的参数列表
    3. 方法的参数个数
    4. 反调用类的方法
    5. 复制代码
      1    // 执行detail方法
      2    $method = new ReflectionMethod('Person', 'test');
      3     
      4    if ($method->isPublic() && !$method->isStatic()) {
      5        echo 'Action is right';
      6    }
      7    echo $method->getNumberOfParameters(); // 参数个数
      8    echo $method->getParameters(); // 参数对象数组
      复制代码
  • 相关阅读:
    字符串删减
    iOS-AFNetworking与ASIHTTPRequest的区别
    iOS-清理缓存
    iOS-addSubView时给UIView添加效果
    iOS-明杰解决字段冲突,及数组映射
    iOS-开发将文本复制到剪切板
    iOS-加载html字符串
    iOS-UILabel加线
    iOS-获取webView的高度
    iOS-plist文件的写读
  • 原文地址:https://www.cnblogs.com/hanyouchun/p/4217840.html
Copyright © 2011-2022 走看看