2012-10-03 55 views
5

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

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

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

+0

你的意思是'(布尔)$ var;'因为我从来没有见过这两个!在一个变量 – rsz

+2

'!'否定之前,所以两个双重否定,将其转换为布尔值... – jeremy

+0

双重否定,正在考虑这一点。很奇怪。你觉得它完全可靠吗? –

回答

9

它是如何工作的?

的不操作变量放入一个条件。因此,结果是布尔值。第二个不会翻转它的价值。

它更清楚只是在代码中使用显式的转换,而不是这样的功能:

(bool)$var; 
+0

迂腐,它是时间顺序中的第二个“不”,或者是物理顺序中的第一个“不”,即翻转该值。 –

+0

@Seth:对。这就是我的意思。 – webbiedave

3

一个!将是一个倒置的布尔于是两个!!使非反转布尔值。这是一个可变的双重否定,并返回作为布尔类型

3

取!! 2

!2评估为!(true)

计算结果为!false最终结果true。非布尔值基本上将右操作数视为布尔值。

2

嗯...有趣。

嗯,PHP进行一系列特定的,当确定变量是否为“真”或“假”的规则。

使用某些运营商将迫使这一决定作出。例如,当您添加一个字符串"a"和一个整数2.运营商,你会得到"a2",因为.操作者的意图是连接。

在这里,第一!意味着你试图否定的变量。否定任何事物意味着你必须首先将它视为一个布尔值,所以这就是它的作用。然后第二个!只是否定它回来。

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

+0

你认为'!! $ var'是检查'to_bool($ var)'的更快方法吗?真是出于好奇!显然,如果有的话,可以忽略不计! –

+0

'if($ var)'是最快的,但是,差异可以忽略不计。 –