覆盖现有的已定义常量

Mac*_*Mac 14 php

可能重复:
在使用php中定义后,可以为具有等号的常量赋值吗?

我不确定它是否只是我,但你如何覆盖现有的常量,如下所示:

define('HELLO', 'goodbye');
define('HELLO', 'hello!');

echo HELLO; <-- I need it to output "hello!"

//unset(HELLO); <-- unset doesn't work
//define('HELLO', 'hello!'); 
Run Code Online (Sandbox Code Playgroud)

131*_*131 10

事实是,你可以,但你不应该.PHP是一种解释型语言,没有什么是你"不能"做的.runkit扩展允许您修改PHP内部行为,并提供runkit_constant_redefine(简单签名)功能.


小智 7

如果从类扩展,则可以覆盖常量.因此,在您的情况下,您不能覆盖常量,因为它考虑来自同一个类.即(摘自php手册):

<?php

class Foo {
    const a = 7;
    const x = 99;
}

class Bar extends Foo {
    const a = 42; /* overrides the `a = 7' in base class */
}

$b = new Bar();
$r = new ReflectionObject($b);
echo $r->getConstant('a');  # prints `42' from the Bar class
echo "\n";
echo $r->getConstant('x');  # prints `99' inherited from the Foo class

?>
Run Code Online (Sandbox Code Playgroud)

如果你打开php错误报告,即:

ini_set('display_errors',1);
error_reporting(E_ALL|E_STRICT);
Run Code Online (Sandbox Code Playgroud)

你会看到像这样的通知

Notice: Constant HELLO already defined in ....
Run Code Online (Sandbox Code Playgroud)


小智 5

如果页面正在重新加载,则可以使用动态值更改常量.

喜欢:

$random = something_that_gives_me_randomness();

define('HELLO', $random);
Run Code Online (Sandbox Code Playgroud)

但是,如果您尝试在同一脚本中更改常量,则linepogl是正确的.它被称为常数是有原因的.