我对以下类使用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
),但由于这一点,我无法区分它们。我希望能够知道:这是一个字符串,或者是一个常量的名称。
答案 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会将所有未知常量转换为具有未知常量名称值的字符串。