PHP,带有 NOT (!) 运算符和另一组括号的 IF 条件


PHP, IF Condition with NOT (!) operator and another set of parentheses

这两个语句有什么区别?

if (!$var === true) {

if (!($var === true)) {

我遇到了一些这样的代码,并试图弄清楚它的用途。

我知道括号内的条件是从最内层向外评估的。

这与

PHP的运算符优先级有关。

===之前评估!。 因此,在第一个例子中:

  1. 否定$var
  2. 将该值与true进行比较

在第二个示例中,您使用括号强制首先发生===。 因此,您可以获得:

  1. $var与真实进行比较
  2. 否定比较

由于您使用===(比较类型和值)来与布尔值进行比较,因此它们并不完全等效。

如果$var = 5呢?

  1. !$var === true变得!5 === true. 这就是0 === true,这是false
  2. !($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)更改两个不同值之间的比较结果。