在类常量PHP中组合位标志[重复]
Posted
技术标签:
【中文标题】在类常量PHP中组合位标志[重复]【英文标题】:Combining bit flags in a class constant PHP [duplicate] 【发布时间】:2012-02-18 21:23:15 【问题描述】:可能重复: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');
所有这一切都很好,除了我想定义“快捷方式位”之类的东西个人。
我试过了,但它抛出了一个错误:
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 不想在常量定义中计算太多,只想要一个值而不是派生值。我假设这是基于它不想要括号也不想要 | 的事实。做进一步的计算。此外,我尝试使用 '-' 而不是 |只是为了测试我的理论。是的,它抱怨 + 也出乎意料。
我该如何解决这个问题,以便我可以定义一个“快捷方式位”,它是其他已定义常量范围的总和。
【问题讨论】:
您需要使用纯数值定义该常量(通过自己添加标志)。 从docs 开始,PHP 5.6.0 中添加了常量表达式支持。因此,您的以下初始方法不会引发错误。const BUILD_DATE_ALL = (self::BUILD_DATE_RFC|self::BUILD_DATE_SQL|self::BUILD_DATE_SQLTIME|self::BUILD_DATE_UNIX);
【参考方案1】:
你可以自己计算。因为这些是位标志,所以有一个模式。
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;
// ....
【讨论】:
有点烦人,因为我想展示实际包含的位,以便其他开发人员可以查看并弄清楚,但这就是 cmets 的用途。我将实施此解决方法。谢谢! 如果您设置了BUILD_DATE_ALL = -1
,那么您就不需要解决它,因为-1
无论如何都会将所有位设置为1。 ALL 标志的最佳实践。【参考方案2】:
引用手册:
值必须是常量表达式,而不是(例如)变量、属性、数学运算的结果或函数调用。
使用 |运算符是运算的结果,因此不允许
【讨论】:
很遗憾 PHP 只允许使用原语。其他语言也会出现这种情况吗?以上是关于在类常量PHP中组合位标志[重复]的主要内容,如果未能解决你的问题,请参考以下文章