布尔值 FALSE 和 TRUE 可以重新定义吗?


Can Boolean FALSE and TRUE be redefined

我正在读一本关于PHP的书,关于使用TRUEFALSE,它说:

事实上,小写版本更稳定,因为 PHP 没有 允许您重新定义它们;大写的可以重新定义

我试图重新定义TRUEFALSE,但没有奏效!!我在谷歌上重新定义了常量,发现我需要使用 runkit_constant_redefine() ,我没有安装 runkit 扩展,所以我无法在 TRUE 和 FALSE 上尝试它。

我的问题是,TRUEtrueFALSEfalse可以在有或没有runkit_constant_redefine()的情况下重新定义吗?

布尔 true 定义为不区分大小写的常量,true是默认表示法。

 define("true", 1, 1);

这意味着它也可以在任何其他外壳中使用,无论是TRUETrueTrUe还是tRUE

你的书所暗示的是再次重新定义另一个案例变体中的常数。你可以。除小写true外,其他所有都是常量查找表中的开放点。

例如 define("True", 2)它将优先于小写定义的true,这将取代其他情况。

无论如何,这是你书中毫无意义的建议。即使你可以为布尔常量声明十几个变体,但实际上没有人这样做。假定的"更稳定"推理实际上是虚假的。首选更具可读性或与现有编码样式匹配的表示法。

您可以在每个命名空间中定义不同的truefalse

namespace foo;
define('foo'true', 0);
if (true) {
    echo 'This will be never printed.';
}

是的,对于大写版本,您可以:

$ php
php > var_dump(defined('TRUE'), TRUE);
bool(true)
bool(true)
php > define('TRUE', 'arglebargle');
php > var_dump(defined('TRUE'), TRUE);
bool(true)
string(11) "arglebargle"
php > echo phpversion();
5.4.16

小写,不是那么多:

php > var_dump(defined('true'), true);
bool(true)
bool(true)
php > define('true', 'foobarbaz');
PHP Notice:  Constant true already defined in php shell code on line 1

但是你为什么要这样做呢?重新定义现实最终很少奏效。

以下是 PHP 手册布尔值的摘录:

常量 TRUE 或 FALSE。两者都不区分大小写。

$foo = True; // assign the value TRUE to $foo

if ($show_separators == TRUE) {

由于这是手册的措辞,因此您可以假设新版本可能不会破坏向后兼容性。在任何情况下,您都可以考虑编写True稳定。尽管建议使用一种一致的代码样式。但这与稳定性无关。

不区分大小写的常量与规范化的小写true一起存储这一事实是一个实现细节,没有进一步的相关性。


关于那些声称重新定义TRUE的人:我设法做到的唯一场景是在自己的命名空间中:

namespace foo;
define("TRUE", "bar");
assert (TRUE === "bar");
assert (TRUE !== 'TRUE)

这是定义foo'TRUE,而不是'TRUE

Mario写道,在前命名空间的PHP版本(PHP<5.3(中,重新定义TRUE是可能的。好吧,PHP-5.3 是在 5 年前发布的。令人惊讶的是,PHP<5.3的市场份额约为PHP-5的23%。所以我想这个话题仍然有有效的相关性。