【问题标题】:Uppercase Booleans vs. Lowercase in PHPPHP 中的大写布尔值与小写字母
【发布时间】:2011-01-02 02:23:53
【问题描述】:

当我学习 PHP 时,我在某处读到你应该始终使用布尔值的大写版本 TRUEFALSE,因为“正常”的小写版本 truefalse 不是t“安全”使用。

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

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

编辑:忘了说这也适用于NULLnull

【问题讨论】:

  • 有许多网站说小写字母据说“快得多”,但没有引用任何严肃的来源。有兴趣看看是否有任何事情发生。
  • 这不是真的。我用 5M 次迭代对其进行了测试,它们都给出了相同的结果,在我的 PC 上只用了 0.5 秒:P
  • @Alex Pekka 也可能意味着小写布尔值的实际编写更快。这是有道理的,必须使用更少的键。不过,差别很小。
  • 对不起,投了你一票后,我不小心投了反对票。
  • 一个有趣的观察:var_export() 将 true 和 false 写为小写,但 NULL 写为大写。可爱,嗯? 3v4l.org/6Oelk

标签: php language-history


【解决方案1】:

没关系,trueTRUE 完全一样。 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。
  • @Noah Goodrich,我在任何时候都没有暗示falsenull 是一样的。我说“falsenull 也一样”,这意味着两者都可以用小写或大写字母表示。
【解决方案2】:

official PHP manual 说:

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

是的,true === TRUEfalse === FALSE

然而,出于可读性原因,我个人更喜欢TRUE 而不是trueFALSE 而不是false。这与我更喜欢使用OR 而不是or||,以及使用AND 而不是and&& 的原因相同。

PSR-2 标准要求 truefalsenull 为小写。

【讨论】:

  • 只想指出 OR|| 在 PHP 中是不同的运算符(因为它们具有不同的优先级),AND&& 也是如此。 (例如,&&|| 的优先级高于赋值运算符,但 ORAND 不是。)
  • 对于今天的 IDE,我看不出有什么理由将纯大写布尔值作为大多数 IDE 的语法高亮显示,将它们区别开来。
  • 我更喜欢将它们输入小写,这样我就不必按住 shift 键了。
  • 我也喜欢小写字母——就像在 java 中一样,但每个人都有自己的。然而,我希望他们能选择一种方式,让我们都换成另一种方式!!!!!!这不是我真正需要的灵活性!
  • @Cyril:有很多充分的理由沉迷于讨厌 PHP(例如,看看上面 Johrn 提到的,我不知道这一点),但考虑到它基本上不区分大小写,混合大小写的表达式相同并没有什么奇怪的。然而,无意义的,它将区分大小写和不区分大小写与一般不敏感混合在一起。 (参见例如:stackoverflow.com/questions/5643496/…
【解决方案3】:

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

我想到的使用大写的一个优点是它们很突出并且很容易在代码中找到。

【讨论】:

  • +1 表示整洁。所有大写字母的传统都来自 C,但现在是我们摆脱这种丑陋形式的时候了。
【解决方案4】:

使用小写。

  1. 打字更容易。 (海事组织)
  2. 它更易于阅读。 (海事组织)
  3. JavaScript 布尔值是小写且区分大小写的。

【讨论】:

  • +1;我只是要添加 Javascript 参数:由于在 Web 编程中编写 PHP 和 JS 代码非常常见,因此发达的 Web 开发手指肌肉继续常规应用在最后一种语言上下文中使用的相同字母大小写。至少我经常发现自己在从 PHP 切换后用 Javascript 编写 TRUE 或 FALSE。在 PHP 中使用小写字母可以永久修复这个问题。
【解决方案5】:
define('TRUE', false);
define('FALSE', true);

调试愉快! (PHP 5.1.3 (2 May 2006),见Demo

编辑: 大写 bool 是常量,小写是值。您对值感兴趣,而不是对常数感兴趣,因为常数很容易改变。


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

【讨论】:

  • -1 因为 A) 这是没有意义的。 B)这不能回答问题。和 C) 我已经接受了正确的答案,这并没有提供任何额外的有用信息。
  • 那我来详细解释一下:大写的bool是常量,小写的是值。您对值感兴趣,而不是对可以轻松更改的常数感兴趣。所以,如果你对文字稍加思考而不急于判罚,你可能会理解这一点。
  • 我理解您(现在)提出的观点,但您最初提出的方式(IMO)神秘且毫无意义。如果您最初只是将您的编辑作为答案,我会投票赞成,因为实际上这是一个非常好的观点。
  • 这是正确的答案。应该为此获得积分。
  • 至于编辑,该描述有点误导......实际值本身(在解析时编译为标记T_NULLT_TRUET_FALSE),不区分大小写,因此使用NULL 实际上并不是一个“常量” --- 除非使它成为一个常量,使用define()。简单地使用NULLTRUE 并不意味着它是一个常量,就好像没有这样的常量,PHP 将其解释为字面量。更准确的描述是小写版本不能重新定义,而任何其他大小写变体可以
【解决方案6】:

我在问自己同样的事情时遇到了这个老问题。 define('TRUE', false);define('FALSE', true); 的优点 但不适用于php5。在 php5 代码中写这些行就像写评论一样。

【讨论】:

  • 仅供参考,您将此作为“答案”发布。在 StackOverflow 上,与传统论坛不同,实际上不能作为问题解决方案且不提供有用信息的对话帖子应作为对原始问题或相关答案的评论发布。在这种情况下,您的帖子更适合对我的问题发表评论而不是答案。
  • 实际上知道这在 PHP 5 中不再起作用是很有帮助的:P
【解决方案7】:

我编写了简单的代码来检查 falseFALSE 之间的区别: 每次迭代都在做一些事情:

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

结果如下:

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

所以我们可以看到布尔大小写对性能的影响非常小 - 小写更快。但你肯定不会看到。

【讨论】:

  • 什么JS引擎?现在 JS 在执行之前是在内存中编译的。
  • PHP在执行前被token化了,应该没有时间上的差异。另一个答案表明,鞋面更快。任何测试中这种量级的差异都应该被忽略 - 这种差异是每次迭代 2.5e-7。
【解决方案8】:

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

【讨论】:

    【解决方案9】:

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

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

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

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

    根据PSR-2 standard

    PHP 关键字必须小写。

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

    【讨论】:

    • 正确,但这个问题专门针对 PHP 中的大写/小写布尔值,而不是 JSON。例如,json_encode(TRUE)json_encode(true) 都产生 'true'
    • 很抱歉提到 JSON,如果我删除所有这些引用并只提到 PSR-2 会更好吗?
    • 我认为对 JSON 的引用是合适的,因为您经常将 javascript/JSON 与 PHP 一起使用,并且可能正在寻找一致性。
    【解决方案10】:

    我曾经使用 C 风格的 TRUE/FALSE 布尔值,就像所有的 const 一样,全部大写,直到我加入 PSR 的潮流。

    PSR-2 第 2.5 节:

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

    所以基本上,如果你想很好地使用开源风格细节,布尔值必须是小写的。

    【讨论】:

      【解决方案11】:

      我迟到了几年,但想提一些有趣的东西,但还没有出现在线程中。今天我发现True 也是有效的,而不仅仅是trueTRUE。所有拼写都是等价的。这与 PHP 的 Open API 生成器有关,它使用 True。 (这让我陷入了一种困惑的心态,并通过搜索找到了这个页面)。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2015-09-19
        • 2013-02-04
        相关资源
        最近更新 更多