在类常量PHP中组合位标志

时间:2012-01-25 17:17:12

标签: php bit-manipulation class-constants

  

可能重复:
  Workaround for basic syntax not being parsed

我试图允许开发人员指定任何位组合,以指定他们想要包含在响应中的哪些数据。

    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不希望在常量定义中计算太多而只想要一个值而不是派生值。我假设这是基于它不需要括号,也不想要|的事实做进一步的计算。另外,我尝试使用' - '而不是|只是为了测试我的理论..是的,它抱怨+也是出乎意料的。

如何修复问题,以便我可以定义一个'快捷位',它是其他已经定义的常量范围的总和。

2 个答案:

答案 0 :(得分:6)

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

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;
       // ....
}

答案 1 :(得分:1)

摘自手册:

  

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

使用|运算符是操作的结果,因此不会被提交