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

yipeiwu_com5年前PHP代码库
PHP中的扩展反射类,该扩展用来分析php程序,导出或提取出关于类、方法、属性、参数等的详细信息,包括注释。
看一个这样的问题,php类的成员变量没有在类中声明,而是在函数中声明,有什么不同?
复制代码 代码如下:

class test{
    private $name;
    private $sex;
    function __construct(){
        $this->aaa='aaa';
    }
}

$test=new test();

$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是“动态”语言,所以可以类的成员变量不用声明,在函数中声明也是可以的。

相关文章

百度工程师讲PHP函数的实现原理及性能分析(三)

常用php函数实现及介绍 count count是我们经常用到的一个函数,其功能是返回一个数组的长度。 count这个函数,其复杂度是多少呢? 一种常见的说法是count函数会遍历整个数...

php读取文件内容的方法汇总

本文实例汇总了php读取文件内容的方法。分享给大家供大家参考。具体如下: 这里汇总php读取文件内容的五种方法。实际应用当中,请注意关闭 fclose($fp); 第一种方法:fread...

php检查是否是ajax请求的方法

本文实例讲述了php检查是否是ajax请求的方法。分享给大家供大家参考。具体如下: 通过这段代码可以判断用户的请求是否来自AJAX XMLHttpRequest,以区别普通post,ge...

ubuntu 编译安装php 5.3.3+memcache的方法

//编译安装php 5.3.3 由于php5.3.X已经自带了php-fpm所以不需要打补丁 # sudo ./configure --prefix=/usr/local/php-5.3...

基于PHP Socket配置以及实例的详细介绍

基于PHP Socket配置以及实例的详细介绍

2个php测试文件server.php复制代码 代码如下:<?php     //phpinfo();//确保在连接客户端时不会超时set_...