这里的问题很简单。 一直在查看一些代码,我已经看到了一个似乎将给定变量转换为布尔值的函数。 它是这样的:
function to_bool( $var ) {
return !!$var;
}
很简单,但是它如何工作? 以前从未见过,谷歌搜索并没有真正吸引我。 额外的"!" 排序结果如何? '!$ var'可用于检查var是否为假,'!!' 把"假"变成真,反之亦然?
你的意思是(bool)$var;,因为我在两个之前从未见过! 在变量之前
!求反,所以有两个双求和,将其转换为布尔值...
双底片,一直在想。 很奇怪。 您认为它完全可靠吗?
好问题老兄
这种构造在其他语言中更为常见。 显然,这是在C ++中强制转换为bool而不产生编译器警告的一种方法。 -实际上,这种做法可能是由于C直到C99才具有本机布尔类型(?)
那么,$var的适当值是什么? 即时通讯试图了解为什么id需要这样做
我真的建议不要为此使用函数。 (bool)$var在任何需要的地方它都更加干净,并且不需要库函数来避免致命错误。
how does it work?
not运算符将变量置于条件中。因此,结果是布尔值。第二个不会翻转其值。
更清楚的是,在代码中使用显式强制转换,而不是使用这样的函数:
(bool)$var;
要学究,第二个不在时间序列上,或者第一个不在物理序列上,将值翻转。
@Seth:对。 那就是我的意思。
拿!! 2
!2计算为!(true)
结果为!false最终结果true。非布尔值基本上将正确的操作数视为布尔值。
一个!将是一个反向布尔值,因此两个!!将成为一个非反向布尔值。这是变量的双重取反,并以布尔类型返回
嗯...有趣。
嗯,PHP在确定变量是" true"还是" false"时遵循一组特定的规则。
使用某些运算符将迫使您做出此决定。例如,当您使用.运算符添加字符串"a"和整数2时,将得到"a2",因为.运算符的意图是连接。
在这里,第一个!表示您正试图否定变量。取反意味着您必须首先将其视为布尔值,这就是它的作用。然后第二个!将其取反。
这是一种奇怪的方式。坦白说,if ($var)的结果与if (to_bool($var))相同。
您是否认为!! $ var是检查to_bool($ var)的更快方法? 真的只是出于好奇! 如果有的话,差异显然可以忽略不计!
if($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