PHP常量不区分大小写的问题

3

我正在使用不区分大小写的参数覆盖一个常量。但是php没有给我“常量已经定义”的错误。我已经启用了E_ALL,E_STRICT错误。 例如:1

define('ONE',1000);
define('one',2000,true);
echo ONE; // prints 1000
echo one; // prints 2000

在第二行中,我将“one”定义为另一个不区分大小写的常量,这意味着重新定义了“ONE”。但是PHP没有给出任何错误/警告。
示例2
define('ONE',1000,true);
define('one',2000);
echo ONE; // prints 1000 with constant already defined notice
echo one; // prints 1000

在这里我可以获得错误通知。

这两个代码块有什么区别?

2个回答

6

根据文档

注意:不区分大小写的常量会以小写形式存储。

因此,在尝试定义第二个示例中的小写版本时,由于先前使用相同名称的不区分大小写常量定义,该常量已经被定义。

define('ONE', 1000, true);  // defines strtolower("ONE") = "one"
define('one', 2000);        // error redefining "one"

在第一种情况下,不存在这样的碰撞:
define('ONE', 1000);        // defines "ONE"
define('one', 2000, true);  // defines strtolower("one") = "one"

0
define函数中的第三个参数是case_insensitive选项。 http://php.net/manual/de/function.define.php 在第一个示例中,定义了常量ONE。同时也定义了一个具有 case_insensitive 属性为 true 的one。这意味着您可以通过ONE和oNe、One、oNE等变量名来访问它。
在第二个示例中,首先定义了一个具有case_insensitive属性为true的常量ONE,然后定义了常量one。但是这次所有可能的名称(OnE、oNe、one)都已经被使用,所以解释器会给出错误提示。

1
这几乎有意义。不幸的是,它是错误的。如果在第一个示例中交换两个define(使不区分大小写的定义首先出现),它仍然显示1000和2000。如果这个答案是正确的,我应该看到一个通知和两个1000,就像第二个示例一样。 - cHao
真的吗?那我就不明白了 :P - c4pone
2
嗯,这是PHP的怪异之处。只要接受它就好了。:P 如果你歪着头、眯起眼睛并记住我们谈论的仍然是PHP,那么看看Niko的答案就能明白了。 - cHao

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接