如果我将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."
预期结果:
常量值在声明后不应更改。
实际结果:
它允许我覆盖常量的现有值。
答案 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()。