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

50

你能否在PHP中取消或更改常量?


48
换句话说,您希望将一个常数变成一个变量?您可能需要再考虑一段时间。 - Marc B
6
@MarcB 但是考虑到 OP 的用户名,这样说是恰当的。 - abligh
1
@MarcB,楼主显然意识到了这个问题的讽刺之处(他/她只是为了发这个问题而注册了一个账户),但仍然认真地提出了这个问题。如果这样说会更合理一些:“你能取消 PHP 创建者决定称之为“常量”之一的东西吗?” - Chris L
7
在"C"语言世界中,这具有优先权。宏定义经常被取消定义然后重新定义--所以请考虑这一点 ;) - ReverseEMF
1
将一个常量取消定义是否有意义并不重要。这是一个合法的问题,有一个明确的答案。 - alexg
6个回答

57

5
并非一定如此。在某些情况下,良好的设计需要全局变量。 - George Cummins
2
那么为什么WordPress在66个文件中使用全局关键字851次? - TheConstantGardener
46
不可避免的答案是:“因为WordPress设计不佳。” - George Cummins
16
你知道吗,乔治,也许我们需要包括字典和PHP手册中的定义,以确保。你永远不知道单词"constant"的定义会不会......别等了......改变。(我整周都在这里开玩笑。) - BoltClock
2
这不是一个常量,而是一个“宏定义”。在‘C’世界(PHP语言的松散模型),宏定义可以被未定义和更改。如果宏定义旨在作为“常量”,为什么要称之为“宏定义”?在‘C’中,“const”关键字创建一个实际的常量。一个#define并不是真正的常量(因为它可以被未定义和重新定义为不同的值)。在‘C’中,在取消定义/重新定义后,任何使用该宏定义的地方都将具有不同的含义。因此,那些比PHP代码范围更广的人可能会看到“宏定义”一词,并想知道是否存在“未定义”。 - ReverseEMF
显示剩余4条评论

28

我知道现在才来晚了,但这里有一件事情可能会对某些人有所帮助...

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

if( !defined( "LOGGER_ENABLED" )){
define( "LOGGER_ENABLED", true );
}

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

define( "LOGGER_ENABLED", false );

1
不看你的整个应用程序,这可能是一个不公平的假设,但“覆盖”自己的系统听起来有点破解。你不能重新设计你的应用程序/框架,以更好地管理基于更具体或逻辑的东西是否应启用Logger吗?就目前而言,这听起来非常琐碎,难以使用和管理,并且对于似乎很少使用的东西来说过于复杂。这是一个有效的答案,为问题添加了潜在有用的信息,因此不会被downvote,但它可能会促进不良实践。 - James
@patrick,是的,但如果有人想要更改已经设置的值,我认为Nils Luxton的答案最适合它。希望你还记得我。 - Dipesh Parmar
5
这应该被接受为答案,因为它提供了一个可行的解决方案。在例如C编码中,这也是通常的做法,所以我认为在PHP中使用它不成问题。 - Siniša

16

30
像这样的胡言乱语是导致存在大量糟糕的PHP代码的原因之一。以这种方式破坏语言结构是一个糟糕的想法,会给使用者留下不好的印象。 - George Cummins
3
Runkit 是一个可选的 PHP 扩展,我从未见过任何网络主机安装它。 - gnud
10
我同意你的观点!不过,原帖中没有提到他们正在做什么或为什么想要取消/重新定义常量,而其他人可能正在寻找类似于Runkit的实验性语言黑客工具,所以我想发一篇帖子来介绍一下。 - Nils Luxton
4
我肯定认为这有合法的用途。一些应用程序(如Joomla组件)将它们的翻译作为常量提供。如果您想在不更改原始源代码/语言文件的情况下更改翻译,则可以使用上述函数在自定义语言文件中完成所有操作,因为语言文件和源代码往往会不时更新。当然,对于翻译来说,使用常量肯定是一种不好的方式 - 但有时候你必须利用手头的资源去工作。 - Deckard
1
另一个用途可能是您希望使用安装应用程序设置覆盖默认应用程序设置。无论如何,只需使用具有公共属性的静态类即可。 - OCDev
显示剩余2条评论

15

不可以。一旦一个常量被定义,就无法更改或未定义。


4
这是错误的。如另一个答案中所提到的,runkit扩展从PHP 4开始就允许它。最近,uopz扩展也允许从PHP 5.4开始使用它。 - Nick Rice

9

除非另有说明,否则uopz扩展允许通过uopz_undefine()删除常量,适用于PHP 5.4+。


4
投反对票的人:如果我写的有错,请说出来或纠正! - Nick Rice
1
您需要安装并启用Zend扩展的用户操作才能使其正常工作,https://www.php.net/manual/en/uopz.installation.php - Peter Kionga-Kamau

5
其他贴子的意见是正确的 - 你不能这样做。但也许你可以把定义移到你知道常数最佳值的地方。
也许你正在一个大列表中定义常量:
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甚至可以在处理过程中稍后的不同文件中进行。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接