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

时间:2014-10-23 16:37:55

标签: php

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

  

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

我尝试重新定义TRUEFALSE,但它没有用!!我谷歌重新定义常量,发现我需要使用runkit_constant_redefine(),我没有安装runkit扩展,所以我不能尝试TRUE和FALSE ..

我的问题是,TRUEtrueFALSEfalse可以使用或不使用runkit_constant_redefine()重新定义吗?

4 个答案:

答案 0 :(得分:5)

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

 define("true", 1, 1);

这意味着它也适用于任何其他外壳,无论是TRUE还是True还是TrUe还是tRUE

你的书所暗示的是再次在另一个案例变体中重新定义常量。你可以。除小写true之外的所有内容都是常量查找表中的空缺点。

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

无论如何,你的书中提出了毫无意义的建议。即使您可以为布尔常量声明十几个变体,但实际上并没有人这样做。假定的更稳定"推理实际上是假的。首选符号更易读或与现有编码风格相匹配。

答案 1 :(得分:0)

是的,您可以使用大写版本:

$ 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

但你为什么要这样做?重新定义现实最终很难实现。

答案 2 :(得分:0)

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

namespace foo;

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

答案 3 :(得分:-1)

以下是PHP手册Booleans的摘录:

  

常量为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年前发布。令人惊讶的是market share of PHP<5.3约为23%(PHP-5)。所以我猜这个主题仍然有效。