我可以使用define方法更改常量值。如何克服这个问题......?

时间:2014-06-02 06:16:09

标签: php constants

如果我将DEFINE方法中的可选第三个参数传递为TRUE,则允许我覆盖常量的现有值。这不是预期的行为,因为一旦声明了常量值,就不应该更改它。

测试脚本:

define("GREETING", "Hello you.",true); 
echo "before changing the constant value "; 
echo GREETING;  // outputs "Hello you."

define("GREETING", "sample value.");
echo GREETING; // outputs "sample value."

预期结果:

  

常量值在声明后不应更改。

实际结果:

  

它允许我覆盖常量的现有值。

2 个答案:

答案 0 :(得分:2)

实际上你并没有重新声明CONSTANT,而是当你用第三个boolean true声明一个常量不区分大小写时,那么你声明的常量会在场景后面以小写形式声明,所以例如:

define("GREETING", "Hello you.",true);

在内部,它是在lowercase中定义的,当您再次定义时:

define("GREETING", "Hello you.");

它现在在UPPERCASE中定义(默认),因此您有两个不同的常量,它们是:

greeting // first one because of "true" but we don't see it
GREETING // second one

作为证据,您不能使用true重新声明两次相同的常量,例如:

define("GREETING", "Hello you.",true); 
echo "before changing the constant value <br />"; 
echo GREETING;
define("GREETING", "sample value.", true);
echo GREETING;

输出(相同):

before changing the constant value 
Hello you.Hello you.

关于case_insensitive参数:

  

如果设置为TRUE,则定义常量   不区分大小写。默认行为区分大小写;即   CONSTANT和Constant表示不同的值。

因此,CONSTANT不可更改,并且它的名称始终为CONSTANT。阅读手册(User Contributed Notes)。

答案 1 :(得分:0)

写一个函数

function myDefine((string) $name, $value, $ignoreCase = false) {
    if (!isset({$name}) {
       define($name,$value,$ignoreCase);
    } else {
       throw new Exception("constant's value should not be changed once it is declared.");
    }
}

如果isset()不起作用,请尝试empty()。