我正试图根据这个答案在PHP中做一些类似于逐位枚举的事情。然而,当我将所有常量定义为像这样的正则int时,它工作得很好:
final class CountryEnum {
const CZ = 1; //Czech Republic
const DE = 2; //Germany
const DK = 4; //Denmark
//12 more
const US = 32768; //USA
}
当我试图通过位偏移模式定义值时,它不起作用,即:
final class CountryEnum {
const CZ = 1; //Czech Republic
const DE = 1 << 1; //Germany
const DK = 1 << 2; //Denmark
//12 more
const US = 1 << 15; //USA
}
当我尝试运行这个时,PHP认为很合适
分析错误:分析错误,应为
','' or
';''在CountryEnum.php的第[带常量DE的行]
所以我可能错过了一些基本的东西,但我不知所措。
早于5.6的PHP版本
在PHP中,即使表达式的结果总是返回相同的值(如1 << 2
),也不能通过表达式定义类常量或类属性。这是因为类常量是在编译时定义的,而不是在运行时定义的。参见类常量文档:
值必须是常量表达式,而不是(例如)变量、属性、数学运算的结果或函数调用。
PHP 5.6及更高版本
从2014年发布的PHP 5.6开始,常量标量表达式现在在语法上是有效的,并且将被解析。
现在可以在PHP以前期望静态值的上下文中提供一个标量表达式,该表达式涉及数值和字符串文字和/或常量,例如常量和属性声明以及默认函数参数。
- PHP 5.6的新功能
由于某种奇怪的原因,您无法在PHP中(或任何其他属性)将表达式分配给const
。你必须像以前一样离开他们。