可以在PHP中取消定义或更改常量吗?

可以在PHP中取消定义或更改常量吗?,php,constants,Php,Constants,您可以在PHP中取消定义或更改常量吗?否。常量是 参考资料:否。一旦定义了常数,它就永远不能被更改或取消定义。如果您确实需要这样做(尽管我不建议像其他人所说的那样),您可以始终使用Runkit 其他海报是正确的-你不能这样做。但也许你可以把定义移动到你知道常数的最佳值的位置 也许您正在一个大列表中定义常量: define('STRING1','Foo'); define('STRING2', 'Bar'); define('STRING3', 'Baz'); 一旦发现一个条件,就要更改ST

您可以在PHP中取消定义或更改常量吗?

否。常量是


参考资料:

否。一旦定义了常数,它就永远不能被更改或取消定义。

如果您确实需要这样做(尽管我不建议像其他人所说的那样),您可以始终使用Runkit


其他海报是正确的-你不能这样做。但也许你可以把定义移动到你知道常数的最佳值的位置

也许您正在一个大列表中定义常量:

define('STRING1','Foo');
define('STRING2', 'Bar');
define('STRING3', 'Baz'); 
一旦发现一个条件,就要更改STRING2的值。一种方法是延迟定义,直到您知道正确的设置

define('STRING1','Foo');
// define('STRING2', 'Bar');  -- wait until initialization
define('STRING3', 'Baz');

...


if (condition) { 
   define('STRING2', 'Bar type 2');
} else {
   define('STRING2', 'Bar type 1');
}

逻辑设置STRING2甚至可能在其他文件中,稍后在您的处理过程中。

我知道这已经晚了。。。但有一件事可能会帮助一些人

在我的“Application.php”文件(我在其中定义了所有常量并包含在所有脚本中)中,我做了如下操作:

if( !defined( "LOGGER_ENABLED" )){
define( "LOGGER_ENABLED", true );
}
所以通常,每个脚本都将启用日志记录。。。但是,如果在某个特定脚本中我不希望出现这种行为,我可以在包含Application.php之前简单地执行此操作:

define( "LOGGER_ENABLED", false );


正如其他地方没有提到的,对于PHP 5.4+,uopz扩展允许通过uopz_undeine()删除常量。

换句话说,您希望常量成为变量吗?可能想再考虑一段时间。@MarcB但考虑到OP的用户名,这是适当的。@MarcB OP清楚地承认这个问题的讽刺性(他/她写了一个帐户只是为了发布这个问题),但仍然严肃地提出了这个问题。这听起来更合理,比如“你能定义PHP创建者决定调用‘常量’的一个东西吗?”在‘C’世界中,这是优先的。定义通常是未定义的,然后重新定义——所以请考虑一下;)@主持人:不一定。好的设计很少需要全局变量。那么为什么Wordpress在66个文件中使用全局关键字达851次呢?@TheConstantGardener:不可避免的答案是:“因为Wordpress设计糟糕。”如果你想知道为什么有人编辑了你的答案,那是因为。你知道乔治,也许我们需要包括字典和PHP手册中的定义,只是为了确定。你永远不知道“常量”这个词的定义是否会。。。等等。。。改变(我整个星期都在这里。)像这样的胡说八道是有这么多糟糕的PHP代码的原因之一。以这种方式颠覆语言结构是一个糟糕的想法,对开发人员的影响也很糟糕。Runkit是一个可选的PHP扩展,我从未见过它安装在任何web主机上。@George Cummins我同意你的观点!尽管如此,OP没有提到他们在做什么,也没有提到他们为什么想要取消设置/重新定义常量,其他人可能想要一些类似Runkit的东西,用于一些非常实验性的语言黑客的东西,所以我想我会发布它。我肯定看到这是一个合法的目的。一些应用程序(Joomla组件)将其翻译作为常量提供。如果您想在不更改原始源代码/语言文件的情况下更改翻译,您可以使用上述函数在自定义语言文件中完成所有操作,因为语言文件和源代码往往会不时更新。当然,使用常量进行翻译肯定是一种不好的方式——但有时你必须使用你所得到的。也许程序员想从库或包含的脚本中删除剩余内容。在看不到你的整个应用程序的情况下,这可能是一种不公平的假设,但“覆盖”你自己的系统听起来有点老套。你不能重新设计你的应用程序/框架,以便更好地管理是否应该基于更具体或更逻辑的内容启用记录器吗?事实上,这听起来很难使用和管理,而且对于一些听上去不经常使用的东西来说,这也太过分了。这是一个有效的答案,为问题添加了可能有用的信息,因此不会进行否决表决,但可能会助长不良做法。@patrick,是的,但如果有人想更改已设置的值,我认为Nils Luxton答案最适合它。希望你们还记得我。这个答案应该被接受,因为它提供了一个有效的解决方案。这也是eg.C编码的惯常做法,所以我不认为在PHP中使用它是一个问题。这是不正确的。runkit扩展(如另一个答案中所述)从PHP4开始就允许它。最近,uopz扩展还允许它从PHP5.4.0开始:如果我写的是错误的,请说是或更正!您需要安装并启用Zend extension的用户操作,才能使其正常工作,