根据this answer,我正在尝试在PHP中执行类似于按位枚举的操作。然而,当我将所有常量定义为常规整数时,它的效果很好:
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发表了一个合适的说法
解析错误:解析错误,在CountryEnum.php中预期
','' or
';''在行[带有const DE的行]
所以我可能错过了一些基本的基本内容,但我不知所措。
答案 0 :(得分:7)
您无法通过PHP中的表达式定义类常量或类属性,即使表达式的结果始终返回相同的值(如1 << 2
)。这是因为类常量是在编译时定义的,而不是运行时定义的。见Class ConstantsDocs:
值必须是常量表达式,而不是(例如)变量,属性,数学运算的结果或函数调用。
自2014年发布的PHP 5.6起,常量标量表达式现在在语法上有效并将被解析。
现在可以提供一个标量表达式,其中涉及PHP以前期望静态值的上下文中的数字和字符串文字和/或常量,例如常量和属性声明以及默认函数参数。
答案 1 :(得分:3)
由于某些奇怪的原因,您只能将表达式分配给PHP中的const
(或任何其他属性)。你必须像往常一样离开它们。