2013-02-26 60 views
3

我使用大小寫不敏感的參數覆蓋常量。但PHP不給我「恆定已定義」的錯誤。我已啓用E_ALL,E_STRICT錯誤。 實施例:1php常量不區分大小寫問題

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

在第二行中,我正在做「一」作爲另一個常數與情況下敏感的,這意味着重新定義「一」。但PHP不提供任何錯誤/警告。

舉例:2

define('ONE',1000,true); 
define('one',2000); 
echo ONE; // prints 1000 with constant already defined notice 
echo one; // prints 1000 

在這裏我可以得到錯誤的通知。

這兩個代碼塊有什麼區別?

回答

6

documentation

注:不區分大小寫的常量存儲爲小寫。

因此,當在第二個例子中試圖定義常量的小寫版本時,常量已經被定義了,這是因爲先前不區分大小寫定義了一個具有相同名稱的常量。

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

ahhh,現在我明白了,thx – c4pone 2013-02-27 08:08:17

+0

是的..我明白了。謝謝。 – Kathir 2013-02-27 17:02:52

-1

在定義函數的第三個參數是CASE_INSENSITIVE選項。 http://php.net/manual/de/function.define.php

在第一個例子中,恆定的ONE ist被定義。而且case_insensitive是一個常量。意思是你有一個變量,你可以通過一個變量和一個變量,你可以通過oNe,One,oNE等達到。

在secound的例子中,你首先定義一個常量ONE,case_insensitive爲真,然後爲常數。但這一次所有可能的名字(OnE,oNe,one)已經給出,所以翻譯給你一個錯誤通知

+1

這幾乎是有道理的。不幸的是,這是錯誤的。如果你在第一個例子中切換兩個'define'(首先不區分大小寫),它仍然會顯示1000和2000.如果這個答案是正確的,我應該看到一個通知和兩個1000像第二個例子。 – cHao 2013-02-26 17:40:32

+0

真的嗎?然後我沒有得到:P – c4pone 2013-02-26 17:45:20

+2

Eh。這是PHP的古怪。放手去做。 :P見Niko的答案,如果你傾斜頭部,斜視恰到好處,並記住這仍然是我們在這裏討論的PHP。 – cHao 2013-02-26 17:45:37