加入收藏 | 设为首页 | 会员中心 | 我要投稿 珠海站长网 (https://www.0756zz.cn/)- 云服务器、边缘计算、基础存储、云计算、中间件!
当前位置: 首页 > 站长学院 > PHP教程 > 正文

PHP反射类ReflectionClass和ReflectionObject的使用方法

发布时间:2022-06-22 09:21:08 所属栏目:PHP教程 来源:互联网
导读:PHP中的扩展反射类,该扩展用来分析php程序,导出或提取出关于类、方法、属性、参数等的详细信息,包括注释。 看一个这样的问题,php类的成员变量没有在类中声明,而是在函数中声明,有什么不同? class test{ private $name; private $sex; function __cons
  PHP中的扩展反射类,该扩展用来分析php程序,导出或提取出关于类、方法、属性、参数等的详细信息,包括注释。
 
  看一个这样的问题,php类的成员变量没有在类中声明,而是在函数中声明,有什么不同?
 
  class test{
      private $name;
      private $sex;
      function __construct(){
          $this->aaa='aaa';
      }
  }
   
  $test=new test();
  //phpfensi.com
  $reflect=new ReflectionClass($test);
  $pro=$reflect->getDefaultProperties();
  print_r($pro);//打印结果:Array ( [name] => [sex] => )
   
  echo $test->aaa;//打印结果:aaa
  在这个test类中,声明了两个成员变量$name和$sex,但是在构造函数中,又声明了一个变量$aaa,初始化类,使用反射类打印默认成员属性只有声明的两个成员变量属性,但是打印类的$aaa变量发现还是可以输出结果。
 
  请问类的成员变量不用声明,在函数中声明也是可以的吗,有什么区别?
 
  在你这个例子中,使用ReflectionClass是不恰当的,因为__construct只有在实例化class时,才会执行。
 
  也就是说ReflectionClass更多的是反射类声明时的结构,而不是类实例化后的结构,所以没有输出属性aaa是正确,因为属性aaa确实是(在类声明时)不存在的。
 
  那么怎么看属性aaa呢,应该用ReflectionObject反射实例化后的结构,例如:
 
  <?php
  class test{
      private $name;
      private $sex;
      function __construct(){
          $this->aaa='aaa';
      }
  }
  $test=new test();
   
  $reflect=new ReflectionObject($test);
  $pro=$reflect->getProperties();
  print_r($pro);
  经过实例化以后,属性aaa才会存在,这时你就能看到属性aaa了,因为php是“动态”语言,所以可以类的成员变量不用声明,在函数中声明也是可以的。 

(编辑:珠海站长网)

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

    热点阅读