这里有一个相对简单的问题。我一直在查看一些代码,发现了一个函数,似乎可以将给定的变量转换为布尔值。它是这样的:
function to_bool( $var ) {
return !!$var;
}
很简单,但它是如何工作的?我以前从未见过这个,并且谷歌搜索也没有给我带来实质性的帮助。额外的'!'是否有点像翻转结果? '!$var'可以用来检查变量是否为假,那么 '!!' 是否会将“假”变成真,反之亦然?
它是如何工作的?
not运算符将变量放入条件语句中,因此结果为布尔类型。第二个not会翻转其值。
在代码中直接使用显式类型转换比使用这样的函数更清晰:
(bool)$var;
一个 !
表示一个反转的布尔值,所以两个 !!
就代表一个非反转的布尔值。这是对一个变量进行双重否定,并以布尔类型返回。
执行!!2
!2
计算结果为 !(true)
进而计算结果为 !false
最终结果为 true
。逻辑非运算符会将右侧操作数转换为布尔类型。
嗯...有趣。
好的,PHP在确定变量是“true”还是“false”时遵循特定的规则。
使用某些运算符将强制进行该决策。例如,当您使用“.”运算符将字符串"a"
和整数2
相加时,您将得到"a2"
,因为.
运算符的意图是连接。
这里,第一个!
表示您正在尝试否定变量。否定任何东西意味着您必须首先将其视为布尔值,因此它会这样做。然后第二个!
只是将其否定回来。
这是一种奇怪的方法。坦白地说,if ($var)
将产生与您的if (to_bool($var))
相同的结果。
if($var)
是最快的,但是差别可以忽略不计。 - Thomas Kelley您也可以从类型转换的角度来看待这个问题。在 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
(bool)$var;
吗?因为我以前从未见过在变量前使用两个!!。 - rsz!
取反,所以两个双重否定将其转换为布尔值... - jeremy$var
的适当值是什么?我试图理解为什么需要这样做。 - Kristian(bool)$var
更加简洁,而且不需要依赖库函数以避免致命错误。 - Kzqai