php – 为什么非法常量名称不会使用define()抛出错误?

Constants手册:

The name of a constant follows the same rules as any label in PHP. A
valid constant name starts with a letter or underscore, followed by
any number of letters, numbers, or underscores. As a regular
expression, it would be expressed thusly:
[a-zA-Z_\x7f-\xff][a-zA-Z0-9_\x7f-\xff]*

但:

 define ("0000X" , 1);

不抛出任何错误,也不抛出通知和定义的返回true:

var_dump ( defined ( "0000X" ) ); // true

当然,在尝试使用此常量时,它会产生:

Parse error: syntax error, unexpected ‘X’ (T_STRING), expecting ‘,’ or ‘;’ in […][…] on line 3

另一方面,Const

const 0000X = 2;

在初始化时抛出错误,避免错误使用:

Parse error: syntax error, unexpected ‘0000’ (T_LNUMBER), expecting identifier (T_STRING) in […][…] on line 1

如果有人想看到这个:

Live example

解决方法:

这是解析器引擎的限制.当在const中使用时,你本身就受到代码标记化的限制,因为根据定义,以数字开头的标记被视为一个数字,正如许多数学表达式所要求的那样.这就是您在该用法中看到意外T_LNUMBER错误的原因.

由于define是一个以字符串作为参数的语言结构,因此它不会在标记化上出错,因此可以解析并执行它,但最终它的使用仍然在标记化上失败.它确实看起来像一个定义的bug没有检查它对我的可用性的论证,但更可能是PHP中的一个历史怪癖,没有人敢于修复而不知道可能会破坏什么.您可以为它提交错误报告,并查看PHP开发人员的意见.

上一篇:使用Maven覆盖Java常量?


下一篇:c# – 通过资源文件将本地化应用于DisplayAttribute