gpt4 book ai didi

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

转载 作者:可可西里 更新时间:2023-10-31 22:54:27 25 4
gpt4 key购买 nike

来自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);

不抛出任何错误或通知并且定义返回真值:

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 中使用时,您本质上会受到代码标记化的限制,因为根据许多数学表达式的要求,以数字开头的标记根据定义被视为数字。这就是您在该用法中看到 unexpected T_LNUMBER 错误的原因。

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

关于php - 为什么非法常量名称在使用 define() 时不会抛出错误?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25507186/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com