ReflectionClass :: getDefaultProperties()和类常量

时间:2012-02-29 15:32:33

标签: php reflection php-5.3

我对以下类使用Reflection:

class Constant {
    const CONSTANT = 3;
    public $test1 = 'CONSTANT';
    public $test2 = CONSTANT;
}

使用ReflectionClass::getDefaultProperties();时,我收到以下通知:

PHP Notice: Use of undefined constant CONSTANT - assumed 'CONSTANT'

在这行代码上:

$defaultValues = $reflectionClass->getDefaultProperties();

首先,我想知道为什么我在这里得到通知(我的意思是,即使代码100%正确,我也无法预料/避免通知)?

第二,当使用var_export($defaultValues[3])时,它输出'CONSTANT',这是正常的,因为它已被转换为字符串。

那么,如何为CONSTANT输出'CONSTANT'而不是$test2,并为$test1输出引号分隔的字符串?

修改:我得到CONSTANT两种情况$test1$test2),但由于这一点,我无法区分它们。我希望能够知道:这是一个字符串,或者是一个常量的名称。

2 个答案:

答案 0 :(得分:2)

  

为什么我在这里收到通知?

因为您的意思是self::CONSTANT但是尝试使用全局CONSTANT,例如你的代码假设

const CONSTANT = 3;              // global constant

class Constant {
    const CONSTANT = 3;          // class constant
    public $test1 = 'CONSTANT';
    public $test2 = CONSTANT;    // refers to global constant
}

但你想这样做:

class Constant {
    const CONSTANT = 3;
    public $test1 = 'CONSTANT';
    public $test2 = self::CONSTANT; // self indicated class scope
}

后者,这个

$reflectionClass = new ReflectionClass('Constant');
var_dump( $reflectionClass->getDefaultProperties() );

将给出

array(2) {
  ["test1"]=>
  string(8) "CONSTANT"
  ["test2"]=>
  int(3)
}

有没有办法通过Reflection获得["test2"] => self::CONSTANT?不,Reflection API将评估常量。如果你想要self::CONSTANT,你必须尝试一些第三方静态反射API。

显然,如果你想'CONSTANT',请写"'CONSTANT'"

关于编辑:

  

我在两种情况下都获得了CONSTANT($ test1和$ test2),但由于这一点,我无法区分它们。我希望能够知道:这是一个字符串,或者是一个常量的名称。

$foo = CONSTANT表示将常量分配给foo属性。它并不意味着自己分配常数。通过将值赋给属性,它不再是常量值。这是可变的。 “常量的名称”表示为字符串。您可以使用ReflectionClass::hasConstant检查该字符串是否也是类中已定义常量的名称,或者使用defined表示全局常量。

答案 1 :(得分:1)

由于您对$ test2的值使用CONSTANT,并且在它将抛出“未定义常量”错误之前不定义它。你想使用类常量CONSTANT作为public $ test2的值吗?然后使用public $ test2 = self :: CONSTANT。否则在类之前将CONSTANT定义为常量。

请注意,PHP会将所有未知常量转换为具有未知常量名称值的字符串。