为什么可以重新分配声明为不区分大小写的 PHP 常量?

Why is it that PHP constants declared as case insensitive can be reassigned?

最近我在我正在处理的一个巨大系统中发现了一个由这种行为引起的错误:

考虑一下:

define('TEST',10);

echo TEST; // prints 10

define('TEST',20); // Error -> already assigned.

但是如果我们声明它是不敏感的:

define('TEST',10,true);

echo TEST; // prints 10

define('TEST',20); // no error ????

echo TEST; //prints 20

我了解 CS 和 CI 之间的区别,我意识到我在第二个定义中创建了一个新常量。但我真的不 明白为什么这可能吗?

这不是违反常数概念吗? 这种行为是否有任何应用,还是 PHP 奇怪的事情...

因为您的第一个常量(您保存为不区分大小写)以小写形式保存,您可以在 manual:

中读取它

Note: Case-insensitive constants are stored as lower-case.

意味着因为它不区分大小写,所以来自 test 的所有小写和大写变体,即大写的 != TEST 对应于值 10。如果是区分大小写的 TEST 意味着每个字母都是大写的,它是值为 20.

的常量

例如

Test -> 10
tEst -> 10
tesT -> 10
TEST -> 20

并且 "special case" 也是 TEST 如果您在定义区分大小写的常量之前使用它,它仍然指向值为 10.[=20 的常量=]

当您执行 define('TEST',10,true); 时,它存储在 lower case 中,但您可以通过 testTEST 访问它们。

现在没有 constant 的名字是 TEST。因此,当您再次定义它时,该值将设置为 constant.

Check it here