【问题标题】:PHP converting to boolean using '!!'PHP使用'!!'转换为布尔值
【发布时间】:2012-10-03 23:00:04
【问题描述】:

这里是一个相当直截了当的问题。一直在查看一些代码,我看到了一个似乎将给定变量转换为布尔值的函数。它是这样的:

function to_bool( $var ) {
    return !!$var;
}

很简单,但它是如何工作的?以前从未见过这种情况,谷歌搜索并没有真正让我到任何地方。额外的'!'有点翻转结果? '!$var' 可用于检查 var 是否为假,'!!' 也是如此将“假”变为真,反之亦然?

【问题讨论】:

  • 你的意思是(bool)$var;,因为在这两个之前我从未见过!在变量之前
  • ! 否定,所以两个双重否定,将其转换为布尔值...
  • 双重否定,我是这么想的。很奇怪。您认为它完全可靠吗?
  • 这种结构在其他语言中更为常见。 Apparently this is one way to cast to bool in C++ without generating a compiler warning。 -- 事实上,这种做法可能源于 C 在 C99 之前没有原生 bool 类型(?)
  • 我真的不建议为此使用函数。 (bool)$var 无论你在哪里需要它都更加干净,并且不需要库函数来避免致命错误。

标签: php boolean


【解决方案1】:

它是如何工作的?

not 运算符将变量放入条件中。因此,结果是布尔值。第二个不翻转它的值。

在代码中使用显式强制转换比使用这样的函数更清楚:

(bool)$var;

【讨论】:

  • 学究起来,是时间序列中的第二个“非”,或物理序列中的第一个“非”,翻转了值。
  • @Seth:对。我就是这个意思。
【解决方案2】:

一个! 将是一个反转布尔值,因此两个!! 将是一个非反转布尔值。这是一个变量的双重否定,并以布尔类型返回

【讨论】:

    【解决方案3】:

    拿!!2

    !2 计算结果为 !(true)

    计算结果为!false 最终结果true。 not boolean 基本上将右操作数视为 bool。

    【讨论】:

      【解决方案4】:

      嗯……很有趣。

      嗯,PHP 在确定变量是“真”还是“假”时遵循一组特定的规则。

      使用某些运算符将强制做出该决定。例如,当您使用 . 运算符添加字符串 "a" 和整数 2 时,您会得到 "a2",因为 . 运算符的意图是连接。

      这里,第一个! 表示您正在尝试否定变量。否定任何东西意味着您必须首先将其视为布尔值,这就是它的作用。然后第二个! 只是否定它。

      这是一种奇怪的做法。坦率地说,if ($var) 会产生与您的if (to_bool($var)) 相同的结果。

      【讨论】:

      • 你认为 '!!$var' 会是检查 'to_bool($var)' 的更快方法吗?真的只是出于好奇!显然,如果有的话,差异可以忽略不计!
      • if($var) 是最快的,但是是的,差异可以忽略不计。
      【解决方案5】:

      你也可以从类型转换的角度来看这个。在 PHP 中,对值执行逻辑表达式将给出布尔结果。因此,第一个否定隐含地将值转换为布尔值,而第二个求值只是反转第一个否定。你可以使用其他逻辑运算符来做同样的事情(虽然我不推荐它,因为有些有不同的优先级):

      // using "truthy" 2 as a value //
      
      !!2          // true 
      2 ||  false  // true
      2 &&  true   // true
      2 xor false  // true
      
      // using "falsey" 0 as a value //
      
      !!0         // false
      0 ||  false // false
      0 &&  true  // false
      0 xor false // false
      

      【讨论】:

        猜你喜欢
        • 2013-12-03
        • 2021-06-27
        • 1970-01-01
        • 2018-01-24
        • 2012-03-10
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2019-04-07
        相关资源
        最近更新 更多