PHP 反射(Reflection)使用实例

5年以前  |  阅读数:660 次  |  编程语言:PHP 

PHP Reflection是用于获取类、扩展、方法、函数、对象、参数、属性的详细信息。
ReflectionClass类获取类相关信息,如获取属性、方法、文档注释等。


    <?php

    class Person {
      /**
       * For the sake of demonstration, we"re setting this private
       */
      private $_allowDynamicAttributes = false;

      /** type=primary_autoincrement */
      protected $id = 0;

      /** type=varchar length=255 null */
      protected $name;

      /** type=text null */
      protected $biography;

      public function getId()
      {
        return $this->id;
      }
      public function setId($v)
      {
        $this->id = $v;
      }
      public function getName()
      {
        return $this->name;
      }
      public function setName($v)
      {
        $this->name = $v;
      }
      public function getBiography()
      {
        return $this->biography;
      }
      public function setBiography($v)
      {
        $this->biography = $v;
      }
    }

    //导出类
    ReflectionClass::export('Person');

    $r = new ReflectionClass('Person');

    //获取所有属性
    print_r($r->getProperties());

    /**
     * 获取指定属性
     * ReflectionProperty::IS_STATIC
     * ReflectionProperty::IS_PUBLIC
     * ReflectionProperty::IS_PROTECTED
     * ReflectionProperty::IS_PRIVATE
     */
    print_r($r->getProperties(ReflectionProperty::IS_PRIVATE));

    //获取注释
    print_r($r->getProperty('id')->getDocComment());

    //获取方法
    print_r($r->getMethods());

ReflectionExtension 类用于获取扩展相关信息


    $re = new ReflectionExtension('Reflection');
    print_r($re->getClasses()); //扩展的所有类
    print_r($re->getClassNames()); //扩展所有类名

    $dom = new ReflectionExtension('mysql');
    print_r($dom->getConstants());//扩展常量
    print_r($dom->getDependencies());//该扩展依赖
    print_r($dom->getFunctions());//扩展方法
    print_r($dom->getINIEntries());//扩展ini信息
    print_r($dom->getName());//扩展名称
    print_r($dom->getVersion());//扩展版本
    print_r($dom->info());//扩展信息
    print_r($dom->isPersistent());//是否是持久扩展
    print_r($dom->isTemporary()); //是否是临时扩展

ReflectionFunction类 用户获取函数相关信息


    $rf = new ReflectionFunction('array_merge');

    foreach($rf->getParameters() as $item) {
      echo $item . PHP_EOL;
    }

ReflectionMethod类用户获取方法相关信息


    class Person {

      public $name;

      /**
       * get name of person
       */
      public function getName()
      {
        return $this->name;
      }
      public function setName($v)
      {
        $this->name = $v;
      }
    }

    $rm = new ReflectionMethod('Person', 'getName');

    print_r($rm->isPublic());
    print_r($rm->getDocComment());

ReflectionObject 类 用于获取对象相关信息


    class Person {

      public $name;

      public function __construct($name)
      {
        $this->name = $name;
      }

      public function getName()
      {
        return $this->name;
      }

      public function setName($v)
      {
        $this->name = $v;
      }
    }

    $a = new Person('a');

    $ro = new ReflectionObject($a);

    print_r($ro->getMethods());

ReflectionParameter 获取函数或方法参数的相关信息。


    class Person {

      public $name;

      public function __construct($name)
      {
        $this->name = $name;
      }

      public function getName()
      {
        return $this->name;
      }

      public function setName($v)
      {
        $this->name = $v;
      }
    }

    $p = new ReflectionParameter(array('Person', 'setName'), 0);

    print_r($p->getPosition()); //0
    print_r($p->getName()); //v

ReflectionProperty 获取类的属性的相关信息。


    class Person {

      /** 测试 */
      public $name;

      public function __construct($name)
      {
        $this->name = $name;
      }

      public function getName()
      {
        return $this->name;
      }

      public function setName($v)
      {
        $this->name = $v;
      }
    }

    $p = new ReflectionProperty('Person', 'name');

    print_r($p->getDocComment());

Copyright© 2013-2020

All Rights Reserved 京ICP备2023019179号-8