5

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

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

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

4

5 回答 5

9

how does it work?

The not operator places the variable into a conditional. Therefore, the result is boolean. The second not flips its value.

It's more clear just to use an explicit cast in your code rather than such a function:

(bool)$var;
于 2012-10-03T23:02:50.360 回答
3

一个!是倒置的布尔值,所以两个!!是非倒置的布尔值。这是一个变量的双重否定,并以布尔类型返回

于 2012-10-03T23:02:09.677 回答
3

拿!!2

!2评估为!(true)

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

于 2012-10-03T23:02:10.847 回答
2

嗯……有趣。

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

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

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

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

于 2012-10-03T23:04:13.777 回答
0

你也可以从类型转换的角度来看这个。在 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
于 2018-10-21T17:22:51.433 回答