在学习PHP时,我读到某个地方应该始终使用booleans TRUE
和的FALSE
大写版本,因为使用“普通”小写版本true
和false
并不是“安全”的。
现在已经很多年了,我编写的每个PHP脚本都使用大写版本。但是,现在,我对此表示质疑,因为我已经看到很多用小写版本(即Zend Framework)编写的PHP。
是/曾经有理由使用大写版本,还是完全可以使用小写?
编辑:忘记提及这也适用于NULL
和null
。
在学习PHP时,我读到某个地方应该始终使用booleans TRUE
和的FALSE
大写版本,因为使用“普通”小写版本true
和false
并不是“安全”的。
现在已经很多年了,我编写的每个PHP脚本都使用大写版本。但是,现在,我对此表示质疑,因为我已经看到很多用小写版本(即Zend Framework)编写的PHP。
是/曾经有理由使用大写版本,还是完全可以使用小写?
编辑:忘记提及这也适用于NULL
和null
。
Answers:
在官方PHP手册说:
要指定布尔文字,请使用关键字TRUE或FALSE。两者都不区分大小写。
是的,true === TRUE
并且false === FALSE
。
但是,就个人可读性而言,我个人TRUE
一遍true
又FALSE
一遍false
。这也是我偏爱使用OR
over or
或||
以及使用AND
over and
或的相同原因&&
。
的PSR-2标准要求true
,false
并且null
为小写。
OR
和||
PHP中不同的运营商(如它们具有不同的优先级),因为是AND
和&&
。(因此,例如,&&
和||
比赋值运算符的优先级高,但OR
并AND
没有。)
define('TRUE', false);
define('FALSE', true);
调试愉快!(PHP < 5.1.3(2006年5月2日),请参见Demo)
编辑:大写布尔是常量,小写是值。您对值感兴趣,而不是对可以轻松更改的常量感兴趣。
Eliminated run-time constant fetching for TRUE, FALSE and NULL author dmitry <dmitry> Wed, 15 Mar 2006 09:04:48 +0000 (09:04 +0000) committer dmitry <dmitry> Wed, 15 Mar 2006 09:04:48 +0000 (09:04 +0000) commit d51599dfcd3282049c7a91809bb83f665af23b69 tree 05b23b2f97cf59422ff71cc6a093e174dbdecbd3 parent a623645b6fd66c14f401bb2c9e4a302d767800fd
提交d51599dfcd3282049c7a91809bb83f665af23b69(和6f76b17079a709415195a7c27607cd52d039d7c3)
T_NULL
,T_TRUE
以及T_FALSE
在分析时),不区分大小写,因此使用NULL
实际上不是一个“常数” --- 除非您使用使其成为常数define()
。简单地使用NULL
或TRUE
并不意味着它是一个常数,就好像没有这样的常数一样,PHP将其解释为文字。更准确的描述是,小写版本不能被重新定义,而任何其他情况下的变化即可。
如果您打算使用JSON,那么RFC7159会说:
文字名称必须为小写。不允许使用其他文字名称。
从PHP 5.6的向后不兼容更改列表中:
json_decode()现在根据JSON规范始终拒绝JSON文字的非小写变体true,false和null
根据PSR-2标准:
PHP关键字必须小写。
PHP常量true,false和null必须小写。
json_encode(TRUE)
和json_encode(true)
yield 'true'
。
没关系,true
与完全相同TRUE
。这同样适用于false
和null
。我还没有听说过任何时候都会有问题。
弄乱情况的唯一方法是引用这些值,例如:
$foo = false; // FALSE
$bar = "false"; // TRUE
$foo2 = true; // TRUE
$bar2 = "true"; // TRUE
$foo3 = null; // NULL
$bar3 = "null"; // TRUE
限制或鼓励您使用大写或小写的东西可能只是您公司的编码准则或您自己的编码准则。除此之外,您可以随意使用其中任何一个,并且不会导致任何问题。
false
并且null
会保持不变。我说过“ false
和null
” 是相同的,这意味着两者都可以用小写或大写字母表示。
我编写了简单的代码来检查false和FALSE之间的区别:每次迭代都在执行以下操作:
for ($i = 0; $i < self::ITERATIONS; ++$i) {
(0 == FALSE) ;
}
结果如下:
Iterations: 100000000
using 'FALSE': 25.427761077881 sec
using 'false': 25.01614689827 sec
因此,我们可以看到布尔值会稍微影响性能-小写字母会更快。但是当然您不会看到。
就我个人而言,我一直使用小写形式,但是除了使我的代码看起来整洁外,没有其他特殊原因,我唯一使用大写字母的地方是驼峰式类名和变量名。
不过,使用大写字母的一个优点是,它们突出并易于在代码中找到。
这是我在Windows 7x64位Apache / 2.4.9 PHP / 5.5.14上的测试
$blockLimit = 50;
while($blockLimit > 0): $blockLimit--;
//STAR Here ================================================
$msc = microtime(true);
for ($i = 0; $i < 100000; $i++) {
echo (FALSE);
}
echo 'FALSE took ' . number_format(microtime(true)-$msc,4) . " Seconds\r\n";
$msc = microtime(true);
for ($i = 0; $i < 100000; $i++) {
echo (false);
}
echo 'false took ' . number_format(microtime(true)-$msc,4) . " Seconds\r\n";
echo "\r\n --- \r\n";
//Shutdown ==================================================
endwhile;
这次FALSE赢得了20次。因此在我的环境中大写更快。