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

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

这两种说法有什么区别?

if (!$var === true) {

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

我遇到了一些类似的代码,并试图找出它的用途。

我知道括号内的条件是从最里面向外计算的。

这与 PHP 的 Operator Precedence 有关。

!=== 之前 被评估。所以,在第一个例子中:

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

在第二个示例中,您使用括号强制 === 先出现。所以,你得到:

  1. 比较 $var 与 true
  2. 否定比较

由于您正在使用 ===(比较类型和值)来与布尔值进行比较,因此这些 不完全 等价。

如果 $var = 5 怎么办?

  1. !$var === true 变为 !5 === true。那就是0 === true,也就是false.
  2. !($var === true) 变为 !(5 === true)。即!(false),即true

注意:在第一个示例中执行 !5 时,5converted to a boolean,然后取反(这就是 ! 的工作原理)。在第二个示例中没有 5 的布尔转换,因为您使用的是 ===.

注2:第二个例子等同于$var !== true.

如果 $var 是布尔值或等效布尔值,则第一个代码片段会将其取反,然后进行比较。例如,如果 $var = false,第一个片段的计算结果将是 if (true === true) { ... }。比较值本身发生了变化(不是变量值,而是用于比较的值)。

这与第二个代码片段相反,后者反转了比较的结果。在前面的示例中,true === true 显然会导致 true。在第二个片段中,如果 $var = false(如上例所示),则 false === true 为假。但是,我们然后否定该比较的结果并得到 false.

这里的答案是一样的,只是计算方式本来就不一样。我很难想到一个例子,在这个例子中,这两个结果会产生不同的答案。但是他们做的是两种不同的操作。

不过如前所述:第一个示例 !$val 更改了用于与 true 进行比较的值,而第二个示例 !($val === true) 更改了结果两个不同值之间的比较。