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

时间:2015-04-29 10:03:53

标签: php constants

最近我在一个庞大的系统中发现了一个错误,我正在努力解决这个问题:

考虑一下:

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奇怪的东西......

2 个答案:

答案 0 :(得分:3)

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

  

注意:   不区分大小写的常量存储为小写。

意味着,因为它不区分大小写test的所有大小写的变体,大写的!= TEST都对应于值10。如果TEST区分大小写,则表示每个大写字母都是值为20的常量。

E.g。

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

"特殊情况"也是TEST如果在定义区分大小写的常量之前使用它,它仍然指向值为10的常量。

答案 1 :(得分:0)

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

现在没有名为TEST的{​​{1}}。因此,当您再次定义它时,该值将设置为constant

Check it here