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

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

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

4

2 回答 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"
于 2013-02-26T17:34:53.093 回答
0

定义函数中的第三个参数是 case_insensitive 选项。 http://php.net/manual/de/function.define.php

在第一个示例中,定义了常量 ONE。以及 case_insensitive 为 true 的常量。意味着您有一个可以通过 ONE 访问的变量和一个可以通过 oNe、One、oNE 等访问的变量。

在第二个示例中,您首先使用 case_insensitive true 定义常量 ONE,然后定义常量 ONE。但是这次所有可能的名字(OnE,oNe,one)都已经给出了,所以解释器给你一个错误通知

于 2013-02-26T17:38:22.793 回答