PHP中的大写布尔与小写


135

在学习PHP时,我读到某个地方应该始终使用booleans TRUE和的FALSE大写版本,因为使用“普通”小写版本truefalse并不是“安全”的。

现在已经很多年了,我编写的每个PHP脚本都使用大写版本。但是,现在,我对此表示质疑,因为我已经看到很多用小写版本(即Zend Framework)编写的PHP。

是/曾经有理由使用大写版本,还是完全可以使用小写?

编辑:忘记提及这也适用于NULLnull


4
有许多网站说,将其写为小写应该“更快”,但没有引用任何严肃的消息来源。有兴趣看看是否有任何事情发生。
Pekka 2010年

2
这不是真的。我用5M迭代对其进行了测试,它们都给出了相同的结果,在我的PC上为0.5秒:P
Alex

9
@Alex Pekka也可能意味着小写布尔值的实际编写速度更快。这很有道理,不必使用更少的键。不过,差别很小。
马丁·莱恩

抱歉,我为您投票后不小心投了反对票。
SIFE 2013年

1
一个有趣的观察:var_export()将true和false写入小写,但将NULL写入大写。可爱,是吗?3v4l.org/6Oelk
donquixote 2015年

Answers:


89

官方PHP手册说:

要指定布尔文字,请使用关键字TRUE或FALSE。两者都不区分大小写。

是的,true === TRUE并且false === FALSE

但是,就个人可读性而言,我个人TRUE一遍trueFALSE一遍false。这也是我偏爱使用ORover or||以及使用ANDover and或的相同原因&&

PSR-2标准要求truefalse并且null为小写。


81
只是想指出的是,OR||PHP中不同的运营商(如它们具有不同的优先级),因为是AND&&。(因此,例如,&&||比赋值运算符的优先级高,但ORAND没有。)
Johrn

21
同样,对于当今的IDE,我看不出有理由将纯大写的布尔值用作语法高亮显示的原因,因为大多数IDE都以很大的区别将它们分开。
罗伯特·皮特(RobertPitt)2010年

37
我更喜欢输入小写字母,因此不必按住Shift键。
2012年

6
我也喜欢小写字母,就像在Java中一样,但是每个字母都有。但我希望他们能以一种方式解决,只是让我们所有人都换一个或另一个!这不是我真正需要的灵活性!

5
@Cyril:沉迷于PHP是有很多充分的理由的(例如,看看Johrn上面提到的内容,我不知道是不是这样),但是鉴于它基本上不区分大小写,所以在混合大小写中没有什么奇怪的表达式是相同的。什么废话,但是,它混合大小写和不区分大小写与一般的麻木。(见例如:stackoverflow.com/questions/5643496/...
SZ。

110
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


7
-1是因为A)这毫无意义。B)这不能回答问题。和C)我已经接受了正确的答案,并且这里没有提供任何其他有用的信息。
奥斯丁·海德

36
然后让我详细解释:大写布尔是常量,小写是值。您对值感兴趣,而不是对可以轻松更改的常量感兴趣。因此,如果您对文本稍加思索而又不想仓促处罚,您可能会理解这一点。
Radu

13
我了解您现在(现在)提出的要点,但您最初提出的目的是(IMO)神秘而毫无意义。如果您最初只是将您的编辑作为答案,那么我会赞成,因为实际上这是一个很好的观点。
奥斯丁·海德

4
这是正确的答案。应该已经得到了这一点。
serialworm 2011年

22
至于编辑,这样的描述是有些误导......实际值本身(这被编译分解成令牌T_NULLT_TRUE以及T_FALSE在分析时),不区分大小写,因此使用NULL实际上不是一个“常数” --- 除非使用使其成为常数define()。简单地使用NULLTRUE并不意味着它是一个常数,就好像没有这样的常数一样,PHP将其解释为文字。更准确的描述是,小写版本不能被重新定义,而任何其他情况下的变化即可

31

使用小写。

  1. 输入起来更容易。(IMO)
  2. 更容易阅读。(IMO)
  3. JavaScript布尔值是小写且区分大小写。

6
+1; 我只是想添加Javascript参数:由于在Web编程中同时编写PHP和JS代码非常普遍,因此,发达的Web开发手指肌肉将继续例行地使用与上一种语言环境中相同的字母大小写。从PHP切换后,至少我经常发现自己用Javascript编写TRUE或FALSE。在PHP中使用小写字母可以永久解决此问题。
Sz。

11

如果您打算使用JSON,那么RFC7159会说:

文字名称必须为小写。不允许使用其他文字名称。

PHP 5.6的向后不兼容更改列表中:

json_decode()现在根据JSON规范始终拒绝JSON文字的非小写变体true,false和null

根据PSR-2标准

PHP关键字必须小写。

PHP常量true,false和null必须小写。


是的,但是这个问题专门针对PHP中的大写/小写布尔值,而不是JSON。例如,json_encode(TRUE)json_encode(true)yield 'true'
奥斯丁·海德

3
抱歉提到JSON,如果我删除所有这些引用而仅提及PSR-2,会更好吗?
Mandrake

4
我认为对JSON的引用是适当的,因为您经常将javascript / JSON与PHP配合使用,并且可能正在寻找一致性。
Doug Kress

9

我曾经像所有的const一样,都使用C样式的TRUE / FALSE布尔值,直到我进入PSR潮流。

PSR-2第2.5节:

PHP常量true,false和null必须小写。

因此,基本上,如果您想与开源风格的细节融为一体,则布尔值必须小写。


5

没关系,true与完全相同TRUE。这同样适用于falsenull。我还没有听说过任何时候都会有问题。

弄乱情况的唯一方法是引用这些值,例如:

$foo = false;   // FALSE
$bar = "false"; // TRUE

$foo2 = true;   // TRUE
$bar2 = "true"; // TRUE

$foo3 = null;   // NULL
$bar3 = "null"; // TRUE

限制或鼓励您使用大写或小写的东西可能只是您公司的编码准则或您自己的编码准则。除此之外,您可以随意使用其中任何一个,并且不会导致任何问题。


FALSE和NULL不相同。如果值=== FALSE,则is_null()不会返回true。
诺亚·古德里奇

9
@诺亚·古德里奇(Noah Goodrich),我在任何时候都没有暗示这一点,false并且null会保持不变。我说过“ falsenull” 是相同的,这意味着两者都可以用小写或大写字母表示。
塔图·乌尔曼嫩

5

我编写了简单的代码来检查falseFALSE之间的区别:每次迭代都在执行以下操作:

    for ($i = 0; $i < self::ITERATIONS; ++$i) {
       (0 == FALSE) ;
    }

结果如下:

Iterations: 100000000
using 'FALSE': 25.427761077881 sec
using 'false': 25.01614689827 sec

因此,我们可以看到布尔值会稍微影响性能-小写字母会更快。但是当然您不会看到。


什么JS引擎?如今,JS在执行之前已在内存中编译。
Tiberiu-Ionuț Stan

1
PHP在执行之前已被标记化,并且时间不应有差异。另一个答案表明鞋帮速度更快。在任何测试中,这种大小的差异都应该忽略不计-每次迭代该差异为2.5e-7。
Doug Kress

4

就我个人而言,我一直使用小写形式,但是除了使我的代码看起来整洁外,没有其他特殊原因,我唯一使用大写字母的地方是驼峰式类名和变量名。

不过,使用大写字母的一个优点是,它们突出并易于在代码中找到。


2
整洁+1。所有大写字母的传统都来自C,但是现在是时候摆脱这种难看的形式了。
Petruza 2012年

2

我问自己同样的事情时遇到了这个老问题。使用define('TRUE',false); define('FALSE',true); 不适用于php5。用php5代码编写这些行就像编写注释。


6
仅供以后参考,您将其发布为“答案”。与传统论坛不同,在StackOverflow上,实际上不充当问题解决方案且不提供有用信息的对话性帖子应作为对原始问题或相关答案的评论发布。在这种情况下,您的帖子将比回答更适合对我的问题发表评论。
奥斯丁·海德

8
实际上,知道这在PHP 5中不再有用是很有帮助的:P
Alex

1

这是我在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次。因此在我的环境中大写更快。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.