最近我在一个庞大的系统中发现了一个错误,我正在努力解决这个问题:
考虑一下:
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奇怪的东西......
答案 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
中,但您可以test
和TEST
访问它们。 constant
。
现在没有名为TEST
的{{1}}。因此,当您再次定义它时,该值将设置为constant
。