这里相当直截了当的问题。一直在查看一些代码,我看到了一个似乎将给定变量转换为布尔值的函数。它是这样的:
function to_bool( $var ) {
return !!$var;
}
很简单,但它是如何工作的?以前从未见过这种情况,谷歌搜索并没有真正让我到任何地方。额外的'!' 有点翻转结果?'!$var' 可用于检查 var 是否为假,'!!' 也是如此 将“假”变为真,反之亦然?
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;
一个!
是倒置的布尔值,所以两个!!
是非倒置的布尔值。这是一个变量的双重否定,并以布尔类型返回
拿!!2
!2
评估为!(true)
评估为!false
最终结果true
。not boolean 基本上将右操作数视为 bool。
嗯……有趣。
好吧,PHP 在确定变量是“真”还是“假”时遵循一组特定的规则。
使用某些运算符将强制做出该决定。例如,当您使用运算符添加字符串和"a"
整数时,您会得到,因为运算符的意图是连接。2
.
"a2"
.
在这里,第一个!
意味着您试图否定变量。否定任何东西意味着您必须首先将其视为布尔值,这就是它的作用。然后第二个!
只是否定它。
这是一种奇怪的做法。坦率地说,if ($var)
会产生与您相同的结果if (to_bool($var))
。
你也可以从类型转换的角度来看这个。在 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