我正在读一本关于PHP的书,关于使用TRUE
和FALSE
,它说:
事实上,小写版本更稳定,因为 PHP 没有 允许您重新定义它们;大写的可以重新定义
我试图重新定义TRUE
和FALSE
,但没有奏效!!我在谷歌上重新定义了常量,发现我需要使用 runkit_constant_redefine()
,我没有安装 runkit 扩展,所以我无法在 TRUE 和 FALSE 上尝试它。
我的问题是,TRUE
、true
、FALSE
或false
可以在有或没有runkit_constant_redefine()
的情况下重新定义吗?
布尔 true 定义为不区分大小写的常量,true
是默认表示法。
define("true", 1, 1);
这意味着它也可以在任何其他外壳中使用,无论是TRUE
、True
、TrUe
还是tRUE
。
你的书所暗示的是再次重新定义另一个案例变体中的常数。你可以。除小写true
外,其他所有都是常量查找表中的开放点。
例如 define("True", 2)
它将优先于小写定义的true
,这将取代其他情况。
无论如何,这是你书中毫无意义的建议。即使你可以为布尔常量声明十几个变体,但实际上没有人这样做。假定的"更稳定"推理实际上是虚假的。首选更具可读性或与现有编码样式匹配的表示法。
您可以在每个命名空间中定义不同的true
和false
。
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%。所以我想这个话题仍然有有效的相关性。