在类常量PHP中组合位标志


Combining bit flags in a class constant PHP

可能重复:
未解析的基本语法的解决方法

我试图允许开发人员指定任何比特组合,以指定他们希望在响应中包含哪些数据。

    class ClassName {
            const BUILD_DATE_RFC = 1; 
            const BUILD_DATE_SQL = 2;
            const BUILD_DATE_SQLTIME = 4;
            const BUILD_DATE_UNIX = 8;
           // ....
   }

这在某种意义上是有效的,当我像这样实例化类时:

$whatever = new ClassName(BUILD_DATE_RFC|BUILD_DATE_SQL);

该逻辑将被执行:

    if (self::BUILD_DATE_RFC & $this->metaBits) {   
        $dateMeta['RFC'] = date('r');
    }
    if (self::BUILD_DATE_SQL & $this->metaBits) {
        $dateMeta['SQL'] = date('Y-m-d');
    }
    if (self::BUILD_DATE_SQLTIME & $this->metaBits) {
        $dateMeta['SQL_time'] = date('Y-m-d H:i:s');
    }

所有这些都很好,除了我想定义"快捷方式位",比如BUILD_DATE_All,它是所有与DATE相关的位的和的值,所以他们只需要指定快捷方式常数,而不是单独指定每个。

我试过了,但它抛出了一个错误:

const BUILD_DATE_ALL =  (self::BUILD_DATE_RFC|self::BUILD_DATE_SQL|self::BUILD_DATE_SQLTIME|self::BUILD_DATE_UNIX);

我还尝试了不同的方法/语法:

const BUILD_REQUEST_ALL =   self::BUILD_IP |
                self::BUILD_USERAGENT |
                self::BUILD_REFERER;

以及我尝试过的另一种方法:

const BUILD_DEFAULT = self::BUILD_DATE_ALL|self::BUILD_REQUEST_ALL^self::BUILD_REFERER^self::BUILD_USERAGENT;

我得到的错误是:

ErrorException:语法错误,意外的"("

对于其他方法,我得到的错误是:

ErrorException:语法错误,意外的"|",应为"、"或";"

看起来PHP不想在常量定义中计算太多,只想要一个值而不是派生值。我假设这是基于这样一个事实,即它不需要括号,也不希望|进行进一步的计算。此外,我试着用"-"而不是|来测试我的理论。。是的,它抱怨+也出乎意料。

我该如何解决这个问题,这样我就可以定义一个"快捷位",它是一系列其他已经定义的常数的总和。

您可以自己计算。由于这些都是位标志,所以有一种模式。

class ClassName {
        const BUILD_DATE_RFC = 1; 
        const BUILD_DATE_SQL = 2;
        const BUILD_DATE_SQLTIME = 4;
        const BUILD_DATE_UNIX = 8;
        const BUILD_DATE_ALL = 15; // 15 = 1|2|4|8;
       // ....
}

Q从手册中退出:

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

|运算符的使用是操作的结果,因此不允许