PHP按位枚举

时间:2012-02-27 21:46:27

标签: php enums

根据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的行]

所以我可能错过了一些基本的基本内容,但我不知所措。

2 个答案:

答案 0 :(得分:7)

早于5.6的PHP版本

您无法通过PHP中的表达式定义类常量或类属性,即使表达式的结果始终返回相同的值(如1 << 2)。这是因为类常量是在编译时定义的,而不是运行时定义的。见Class Constants­Docs

  

值必须是常量表达式,而不是(例如)变量,属性,数学运算的结果或函数调用。

PHP 5.6及更高版本

自2014年发布的PHP 5.6起,常量标量表达式现在在语法上有效并将被解析。

  

现在可以提供一个标量表达式,其中涉及PHP以前期望静态值的上下文中的数字和字符串文字和/或常量,例如常量和属性声明以及默认函数参数。

答案 1 :(得分:3)

由于某些奇怪的原因,您只能将表达式分配给PHP中的const(或任何其他属性)。你必须像往常一样离开它们。