6

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

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

    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 这将是所有与日期相关的位的总和的值,因此他们只需要指定快捷方式常量而不是单独指定每个位。

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

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

我该如何解决这个问题,以便我可以定义一个“快捷方式位”,它是其他已定义常量范围的总和。

4

2 回答 2

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;
       // ....
}
于 2012-01-25T17:22:13.050 回答
1

引用手册:

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

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

于 2012-01-25T17:20:21.937 回答