我能够改变使用定义方法的常数值.如何克服这个问题……


I am able to change the constant value using define method. How to overcome this issue...?

如果我在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."

预期结果:

常量的值一旦被声明就不应该被改变。

实际结果:

它允许我重写一个常量的现有值。

实际上你并没有重新声明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,正如它的名字所说。阅读手册

写一个函数

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()。