从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
如果有人想看到这个:
解决方法:
这是解析器引擎的限制.当在const中使用时,你本身就受到代码标记化的限制,因为根据定义,以数字开头的标记被视为一个数字,正如许多数学表达式所要求的那样.这就是您在该用法中看到意外T_LNUMBER错误的原因.
由于define是一个以字符串作为参数的语言结构,因此它不会在标记化上出错,因此可以解析并执行它,但最终它的使用仍然在标记化上失败.它确实看起来像一个定义的bug没有检查它对我的可用性的论证,但更可能是PHP中的一个历史怪癖,没有人敢于修复而不知道可能会破坏什么.您可以为它提交错误报告,并查看PHP开发人员的意见.