加入收藏 | 设为首页 | 会员中心 | 我要投稿 应用网_丽江站长网 (http://www.0888zz.com/)- 科技、建站、数据工具、云上网络、机器学习!
当前位置: 首页 > 站长学院 > PHP教程 > 正文

深入认识PHP中的反射机制

发布时间:2022-07-16 15:43:50 所属栏目:PHP教程 来源:互联网
导读:PHP的反射机制提供了一套反射API,用来访问和使用类、方法、属性、参数和注释等,比如可以通过一个对象知道这个对象所属的类,这个类包含哪些方法,这些方法需要传入什么参数,每个参数是什么类型等等,不用创建类的实例也可以访问类的成员和方法,就算类成
  PHP的反射机制提供了一套反射API,用来访问和使用类、方法、属性、参数和注释等,比如可以通过一个对象知道这个对象所属的类,这个类包含哪些方法,这些方法需要传入什么参数,每个参数是什么类型等等,不用创建类的实例也可以访问类的成员和方法,就算类成员定义为 private也可以在外部访问。
 
  官方文档提供了诸如 ReflectionClass、ReflectionMethod、ReflectionObject、ReflectionExtension 等反射类及相应的API,用得最多的是 ReflectionClass。
 
  为了演示反射效果,首先创建一个类(假设定义了一个类 User),并实例化。基于这个实例,反射类可以访问 User 中的属性和方法。
 
  <?php
 
  /**
 
 
      public function __construct($username, $password)
 
      {
 
          $this->username = $username;
 
          $this->password = $password;
 
      }
 
   
 
      /**
 
       * 获取用户名
 
       * @return string
 
       */
 
      public function getUsername()
 
      {
 
      {
 
          $this->username = $username;
 
      }
 
   
 
      /**
 
       * 获取密码
 
       * @return string
 
       */
 
      private function getPassword()
 
      {
 
          return $this->password;
 
      }
 
   
 
      /**
 
       * 设置密码
 
       * @param string $password
 
       */
 
      private function setPassowrd($password)
 
      {
 
          $this->password = $password;
 
      }
 
  }
 
  创建反射类实例
 
 
 
 
 
  $refClass = new ReflectionClass(new User('liulu', '123456'));
 
   
 
  // 也可以写成
 
  $refClass = new ReflectionClass('User'); // 将类名User作为参数,建立User类的反射类
 
  反射属性
 
 
  $properties = $refClass->getProperties(); // 获取User类的所有属性,返回ReflectionProperty的数组
 
  $property = $refClass->getProperty('password'); // 获取User类的password属性
 
  //$properties 结果如下:
 
  Array (
 
     [0] => ReflectionProperty Object ( [name] => username [class] => User )
 
     [1] => ReflectionProperty Object ( [name] => password [class] => User )
 
  )   
 
  //$property 结果如下:
 
  ReflectionProperty Object ( [name] => password [class] => User )
 
  反射方法
 
  $methods = $refClass->getMethods(); // 获取User类的所有方法,返回ReflectionMethod数组
 
  $method = $refClass->getMethod('getUsername');  // 获取User类的getUsername方法
 
   
 
  //$methods 结果如下:
 
  Array (
 
      [0] => ReflectionMethod Object ( [name] => __construct [class] => User )
 
      [1] => ReflectionMethod Object ( [name] => getUsername [class] => User )
 
      [2] => ReflectionMethod Object ( [name] => setUsername [class] => User )
 
      [3] => ReflectionMethod Object ( [name] => getPassword [class] => User )
 
      [4] => ReflectionMethod Object ( [name] => setPassowrd [class] => User )
 
  )
 
  //$method 结果如下:
 
  ReflectionMethod Object ( [name] => getUsername [class] => User )
 
  反射注释
 
 
 
  $classComment = $refClass->getDocComment();  // 获取User类的注释文档,即定义在类之前的注释
 
  $methodComment = $refClass->getMethod('setPassowrd')->getDocComment();  // 获取User类中setPassowrd方法的注释
 
  //$classComment 结果如下:
 
  /** * 用户相关类 */
 
  //$methodComment 结果如下:
 
  /** * 设置密码 * @param string $password */
 
  反射实例化
 
  $instance = $refClass->newInstance('admin', 123, '***');  // 从指定的参数创建一个新的类实例
 
 
  $instance->setUsername('admin_1'); // 调用User类的实例调用setUsername方法设置用户名
 
  $username = $instance->getUsername(); // 用过User类的实例调用getUsername方法获取用户名
 
  echo $username . "n"; // 输出 admin_1
 
   
 
  // 也可以写成
 
  $refClass->getProperty('username')->setValue($instance, 'admin_2'); // 通过反射类ReflectionProperty设置指定实例的username属性值
 
  $username = $refClass->getProperty('username')->getValue($instance); // 通过反射类ReflectionProperty获取username的属性值
 
  echo $username . "n"; // 输出 admin_2
 
   
 
  // 还可以写成
 
  $refClass->getMethod('setUsername')->invoke($instance, 'admin_3'); // 通过反射类ReflectionMethod调用指定实例的方法,并且传送参数
 
  $value = $refClass->getMethod('getUsername')->invoke($instance); // 通过反射类ReflectionMethod调用指定实例的方法
 
  echo $value . "n"; // 输出 admin_3

(编辑:应用网_丽江站长网)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    热点阅读