如果我在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()。