【发布时间】:2014-08-26 13:34:05
【问题描述】:
来自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)
如果有人想看到这一点:
【问题讨论】:
-
你知道
define和const在非常不同的位置进行评估,const在编译时评估(这就是为什么你不能将它设置为函数定义或其他) ,而define在执行时被评估(这就是为什么define('START_TIME', microtime(true));工作得非常好,尽管它每次运行时(几乎)给出不同的结果)。定义的代码没有做任何事情来验证你的常量(我不知道为什么它没有,但它没有)。 -
define不应验证输入。当您想使用(无效)令牌时,您将失败。一切都很好,世界也很好,一切都很好,与宇宙同步。 -
我相信你仍然可以使用
define和constant()定义的无效常量。这并不是一个好主意……