当我学习 PHP 的时候,我在某个地方读到,你应该总是使用布尔值的大写版本,TRUE和 FALSE,因为“正常”的小写版本,true和 false,使用起来不“安全”。
TRUE
FALSE
true
false
现在已经过去很多年了,我编写的每个 PHP 脚本都使用大写版本。但是现在,我对此提出了质疑,因为我已经看到了大量使用小写版本(即 Zend Framework)编写的 PHP。
是否存在使用大写版本的理由,或者使用小写版本是否完全可以?
编辑: 忘了说这也适用于 NULL和 null。
NULL
null
没关系,true和 TRUE是完全一样的。false和 null也是如此。我从没听说过这有什么关系。
唯一能把事情搞砸的方法就是引用这些价值观,例如:
$foo = false; // FALSE $bar = "false"; // TRUE $foo2 = true; // TRUE $bar2 = "true"; // TRUE $foo3 = null; // NULL $bar3 = "null"; // TRUE
限制或鼓励您使用大写或小写的唯一因素可能是您的公司或您自己的编码指南。除此之外,您可以自由地使用其中任何一个,它不会导致任何问题。
正式的 PHP 手册表示:
若要指定布尔值文本,请使用 关键字正确或错误。都是 不区分大小写。
所以 true === TRUE和 false === FALSE。
true === TRUE
false === FALSE
然而,就我个人而言,由于可读性的原因,我更喜欢 TRUE而不是 true和 FALSE。同样的原因,我更喜欢使用 OR而不是 or或 ||,也更喜欢使用 AND而不是 and或 &&。
OR
or
||
AND
and
&&
PSR-2标准要求 true、 false和 null都是小写的。
就个人而言,我总是使用小写形式,但没有特别的原因,只是为了让我的代码看起来整洁,我使用大写字母的唯一地方是当骆驼大小写类名和变量名。
不过,使用大写字母的一个好处是,它们很显眼,而且很容易在代码中找到。
用小写。
define('TRUE', false); define('FALSE', true);
调试愉快! (PHP < 5.1.3(2006年5月2日),参见 演示)
编辑: 大写符号是常量,小写符号是值。您感兴趣的是值,而不是容易更改的常量。
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)
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)
当我问自己同样的问题时,我遇到了这个老问题。 好点与定义(‘ TRUE’,假) ; 定义(‘ FALSE’,真) ; 但是不适用于 php5,在 php5代码中编写这些代码行就像编写注释一样。
我编写了一些简单的代码来检查 假的和 假的之间的差异: 每个迭代都在做一些事情:
for ($i = 0; $i < self::ITERATIONS; ++$i) { (0 == FALSE) ; }
结果如下:
Iterations: 100000000 using 'FALSE': 25.427761077881 sec using 'false': 25.01614689827 sec
因此,我们可以看到,布尔型大小写对性能的影响非常小——小写更快。但你肯定看不到。
下面是我在 Windows 7x64bit 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次,所以在我的环境中大写更快。
如果您打算使用 JSON,那么 RFC7159会说:
文字名称必须小写。不允许使用其他文字名称。
从 PHP 5.6中向后不兼容的更改列表中可以看出:
JSON _ decode ()现在可以根据 JSON 规范在任何时候拒绝 JSON 字面值 true、 false 和 null 的非小写变体
根据 PSR-2标准:
PHP 关键字必须小写。 PHP 常量 true、 false 和 null 必须小写。
PHP 关键字必须小写。
PHP 常量 true、 false 和 null 必须小写。
我过去常常使用 C 风格的 TRUE/FALSE 布尔值,就像所有常量一样,全部大写,直到我跟上了 PSR的潮流。
第二阶段第2.5节:
所以基本上,如果你想在开源风格方面做得更好,布尔值必须是小写的。
我已经迟到好几年了,但是我想提一些有趣的事情,这些事情还没有写进我的帖子里。今天我发现 True也是有效的,不仅仅是 true或者 TRUE。所有的拼写都是等价的。这是相关的,因为 PHP 的 OpenAPI 生成器使用 True。(这让我陷入了一种困惑的心理状态,然后我开始寻找,最终找到了这一页)。
True