PHP,带有 NOT (!) 运算符和另一组括号的 IF 条件
PHP, IF Condition with NOT (!) operator and another set of parentheses
这两种说法有什么区别?
if (!$var === true) {
或
if (!($var === true)) {
我遇到了一些类似的代码,并试图找出它的用途。
我知道括号内的条件是从最里面向外计算的。
这与 PHP 的 Operator Precedence 有关。
!
在 ===
之前 被评估。所以,在第一个例子中:
- 否定
$var
- 将该值与
true
进行比较
在第二个示例中,您使用括号强制 ===
先出现。所以,你得到:
- 比较
$var
与 true
- 否定比较
由于您正在使用 ===
(比较类型和值)来与布尔值进行比较,因此这些 不完全 等价。
如果 $var = 5
怎么办?
!$var === true
变为 !5 === true
。那就是0 === true
,也就是false
.
!($var === true)
变为 !(5 === true)
。即!(false)
,即true
。
注意:在第一个示例中执行 !5
时,5
是 converted 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)
更改了结果两个不同值之间的比较。
这两种说法有什么区别?
if (!$var === true) {
或
if (!($var === true)) {
我遇到了一些类似的代码,并试图找出它的用途。
我知道括号内的条件是从最里面向外计算的。
这与 PHP 的 Operator Precedence 有关。
!
在 ===
之前 被评估。所以,在第一个例子中:
- 否定
$var
- 将该值与
true
进行比较
在第二个示例中,您使用括号强制 ===
先出现。所以,你得到:
- 比较
$var
与 true - 否定比较
由于您正在使用 ===
(比较类型和值)来与布尔值进行比较,因此这些 不完全 等价。
如果 $var = 5
怎么办?
!$var === true
变为!5 === true
。那就是0 === true
,也就是false
.!($var === true)
变为!(5 === true)
。即!(false)
,即true
。
注意:在第一个示例中执行 !5
时,5
是 converted 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)
更改了结果两个不同值之间的比较。