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

hls*_*lon 4 php const constants

Constants手册:

常量的名称遵循与PHP中的任何标签相同的规则.有效的常量名称以字母或下划线开头,后跟任意数量的字母,数字或下划线.作为正则表达式,它将如此表达:[a-zA-Z_\x7f-\xff] [a-zA-Z0-9_\x7f-\xff]*

但:

 define ("0000X" , 1);
Run Code Online (Sandbox Code Playgroud)

不抛出任何错误或通知并defined返回true:

var_dump ( defined ( "0000X" ) ); // true
Run Code Online (Sandbox Code Playgroud)

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

解析错误:语法错误,意外的'X'(T_STRING),期待','或';' 在[...] [...]第3行

Const, 另一方面

const 0000X = 2;
Run Code Online (Sandbox Code Playgroud)

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

解析错误:语法错误,意外的'0000'(T_LNUMBER),在[...] [...]第1行预期标识符(T_STRING)

如果有人想看到这个:

实例

Nie*_*jes 5

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

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