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

时间:2014-08-26 13:34:06

标签: php const constants

来自Constants手册:

  

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

可是:

 define ("0000X" , 1);

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

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

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

  

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

另一方面,

Const

const 0000X = 2;

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

  

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

如果有人想看到这个:

Live example

1 个答案:

答案 0 :(得分:5)

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

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