PHP逐位枚举


PHP bitwise enums

我正试图根据这个答案在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。你必须像以前一样离开他们。