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

The*_*ner 39 php constants

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

Geo*_*ins 50

不,常数是不变的.

参考:php.net/manual/language.constants.php

  • @TheConstantGardener:不可避免的答案是:"因为Wordpress的设计很差." (38认同)
  • 你知道乔治,也许我们需要包括字典*和*PHP手册中的定义,这是肯定的.你永远不知道"常数"这个词的定义是否......等待它......改变.(我整个星期都在这里.) (13认同)
  • @TheConstantGardener:不一定.在很少的情况下,良好的设计需要全局变量. (4认同)
  • 那么为什么Wordpress在66个文件中使用全局关键字851次? (2认同)
  • 如果你想知道为什么有人编辑你的答案,那是因为[它正在讨论Meta](http://meta.stackoverflow.com/q/341743/3258851). (2认同)
  • 它不是一个常数,而是一个“定义”。在“C”世界中(PHP 是大致模仿的语言),定义可以取消定义和更改。如果它的目的是“恒定”,为什么称其为“定义”?在“C”中,“const”关键字创建一个实际常量。#define 并不是真正的常量(因为它可以未定义并使用不同的值重新定义)。在“C”中,该定义的任何使用在取消定义/重新定义后都将具有不同的含义。因此,我们这些编码范围比 PHP 更广泛的人可能会看到“define”这个词,并想知道是否有“undefine”。 (2认同)

Pat*_*eil 24

我知道这场比赛已经晚了......但这里有一件事可能对某些人有所帮助......

在我的"Application.php"文件中(我定义了所有常量并包含在我的所有脚本中),我执行以下操作:

if( !defined( "LOGGER_ENABLED" )){
define( "LOGGER_ENABLED", true );
}
Run Code Online (Sandbox Code Playgroud)

所以通常情况下,每个脚本都会启用日志记录...但是如果在一个特定的脚本中我不想要这种行为,我可以在包含我的Application.php之前执行此操作:

define( "LOGGER_ENABLED", false );
Run Code Online (Sandbox Code Playgroud)

  • 这应该是接受的答案,因为它提供了有效的解决方案.例如,这也是通常的做法.C编码,所以我认为在PHP中使用它不是一个问题 (4认同)

Nil*_*ton 15

如果您绝对需要这样做(虽然我不会像其他人所说的那样推荐它),您可以随时使用Runkit.

http://www.php.net/manual/en/function.runkit-constant-redefine.php

http://www.php.net/manual/en/function.runkit-constant-remove.php

  • 像这样的废话是那里有太多糟糕的PHP代码的原因之一.以这种方式颠覆语言结构是一个可怕的想法,并且对执行它的开发人员反映不佳. (26认同)
  • @George Cummins我同意你的意见!尽管如此,OP还没有提到他们正在做什么,或者为什么他们想要取消/重新定义常数,而其他人可能会在Runkit之类的东西上找到一些非常实验性的语言黑客,所以我想我会发布它. (10认同)
  • 我肯定看到了这个合法的目的.某些应用程序(Joomla组件)将其翻译作为常量提供.如果您想在不更改原始源代码/语言文件的情况下更改翻译,您可以使用上述功能在自定义语言文件中完成所有操作 - 因为语言文件和源代码往往会不时更新.当然,使用常量进行翻译肯定是一种糟糕的方式 - 但有时你必须使用你所得到的东西. (4认同)
  • Runkit是一个可选的PHP扩展,我从未见过安装在任何Web主机上. (3认同)

Col*_*lin 10

不会.定义常量后,永远不会更改或未定义.

  • 这是不正确的。runkit 扩展(如另一个答案中提到的)从 PHP 4 开始就允许它。最近 uopz 扩展也允许它从 PHP 5.4 开始。 (3认同)

Sco*_*son 5

其他海报是正确的 - 你不能这样做。但也许您可以将定义转移到知道常数的最佳值的程度。

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

define('STRING1','Foo');
define('STRING2', 'Bar');
define('STRING3', 'Baz'); 
Run Code Online (Sandbox Code Playgroud)

一旦发现某种情况,您就想更改 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');
}
Run Code Online (Sandbox Code Playgroud)

逻辑设置 STRING2 甚至可以在稍后的处理中位于不同的文件中。


Nic*_*ice 5

如别处未提及,对于PHP 5.4+,uopz扩展允许通过uopz_undefine()删除常量。

  • 不赞成投票的人:如果我写的错了,请这样说或纠正! (3认同)