PHP转换为布尔值使用“!!”

6

这里有一个相对简单的问题。我一直在查看一些代码,发现了一个函数,似乎可以将给定的变量转换为布尔值。它是这样的:

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

很简单,但它是如何工作的?我以前从未见过这个,并且谷歌搜索也没有给我带来实质性的帮助。额外的'!'是否有点像翻转结果? '!$var'可以用来检查变量是否为假,那么 '!!' 是否会将“假”变成真,反之亦然?


你的意思是(bool)$var;吗?因为我以前从未见过在变量前使用两个!!。 - rsz
2
! 取反,所以两个双重否定将其转换为布尔值... - jeremy
双重否定,我在想。非常奇怪。你认为它完全可靠吗? - Matthew Ruddy
这种结构在其他语言中更为常见。实际上,这是在C++中将类型转换为bool的一种方式,而不会生成编译器警告(https://dev59.com/A3VC5IYBdhLWcg3wtzkQ)。事实上,这种做法可能源于C语言直到C99(?)才有本地的bool类型。 - Frank Farmer
那么$var的适当值是什么?我试图理解为什么需要这样做。 - Kristian
3
我强烈建议不要使用一个函数来完成这个任务。在需要的地方直接使用(bool)$var更加简洁,而且不需要依赖库函数以避免致命错误。 - Kzqai
5个回答

10

它是如何工作的?

not运算符将变量放入条件语句中,因此结果为布尔类型。第二个not会翻转其值。

在代码中直接使用显式类型转换比使用这样的函数更清晰:

(bool)$var;

说实话,在时间序列中是第二个“not”翻转值,在物理序列中是第一个“not”翻转值。 - Seth Carnegie
@Seth:没错,我就是这个意思。 - webbiedave

3

一个 ! 表示一个反转的布尔值,所以两个 !! 就代表一个非反转的布尔值。这是对一个变量进行双重否定,并以布尔类型返回。


3

执行!!2

!2 计算结果为 !(true)

进而计算结果为 !false 最终结果为 true。逻辑非运算符会将右侧操作数转换为布尔类型。


2

嗯...有趣。

好的,PHP在确定变量是“true”还是“false”时遵循特定的规则。

使用某些运算符将强制进行该决策。例如,当您使用“.”运算符将字符串"a"和整数2相加时,您将得到"a2",因为.运算符的意图是连接。

这里,第一个!表示您正在尝试否定变量。否定任何东西意味着您必须首先将其视为布尔值,因此它会这样做。然后第二个!只是将其否定回来。

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


你认为使用 '!!$var' 检查 'to_bool($var)' 是否更快?只是出于好奇!显然,差别非常微不足道! - Matthew Ruddy
if($var) 是最快的,但是差别可以忽略不计。 - Thomas Kelley

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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接