这两个语句有什么区别?
if (!$var === true) {
或
if (!($var === true)) {
我遇到了一些这样的代码,并试图弄清楚它的用途。
我知道括号内的条件是从最内层向外评估的。
这与
PHP的运算符优先级有关。
在===
之前评估!
。 因此,在第一个例子中:
- 否定
$var
- 将该值与
true
进行比较
在第二个示例中,您使用括号强制首先发生===
。 因此,您可以获得:
- 将
$var
与真实进行比较 - 否定比较
由于您使用===
(比较类型和值)来与布尔值进行比较,因此它们并不完全等效。
如果$var = 5
呢?
-
!$var === true
变得!5 === true
. 这就是0 === true
,这是false
。 -
!($var === true)
变得!(5 === true)
. 这就是!(false)
,这是true
。
注意:在第一个示例中执行!5
时,5
被转换为布尔值,然后被否定(这就是!
的工作方式)。 在第二个示例中没有5
的布尔转换,因为您使用的是===
。
注2:第二个示例相当于$var !== true
。
如果$var
是布尔值或布尔等效值,则第一个代码片段将反转它,然后进行比较。例如,如果$var = false
,则第一个代码段的计算结果为 if (true === true) { ... }
。比较值本身会发生变化(不是变量值,而是用于比较的值)。
这与第二个代码片段相反,后者反转了比较结果。在前面的示例中,显然true === true
结果以true
表示。在第二个代码段中,如果$var = false
(如上一个示例中所示),则false === true
为 false。但是,我们随后否定该比较的结果并得到false
。
这里的答案是相同的,但它们本质上的计算方式不同。我很难想到一个例子,其中两者导致不同的答案。但他们正在做的是两种不同的操作。
但是,如前所述:第一个示例!$val
更改用于与true
进行比较的值,而第二个示例!($val === true)
更改两个不同值之间的比较结果。