我正在阅读一本关于PHP的书,关于使用TRUE
和FALSE
,它说:
实际上,小写版本更稳定,因为PHP没有 允许你重新定义它们;大写的可以重新定义
我尝试重新定义TRUE
和FALSE
,但它没有用!!我谷歌重新定义常量,发现我需要使用runkit_constant_redefine()
,我没有安装runkit扩展,所以我不能尝试TRUE和FALSE ..
我的问题是,TRUE
,true
,FALSE
或false
可以使用或不使用runkit_constant_redefine()
重新定义吗?
答案 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)
您可以在每个命名空间中定义不同的true
和false
。
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)。所以我猜这个主题仍然有效。