php 中“!print("1") || 1" 的意外行为

Unexpected behaviour of "!print("1") || 1" in php

示例 1:

if(!print("1") || 1){
   echo "a";
}else{
   echo "b";
}

输出

1b

示例 1 正在打印“1b”而不是“1a”。根据我的说法,在解决 !print("1").

但是 示例 2 正在打印“1a”。

示例 2:

if((!print("1")) || 1){
   echo "a";
}else{
   echo "b";
}

输出

1a

您能否详细说明,为什么第一个语句中的 or 条件不起作用。

这里的关键是要意识到 print 不是一个函数,并且不在括号中接受参数 - 括号不是可选的,它们根本不是语法的一部分.

当您编写 print("1"); 时,打印语句只有一个参数,即表达式 ("1")。也就是说,如果当然只是另一种写作方式 "1" - 您可以添加任意数量的括号并且它不会更改值。

因此,当您编写 print("1") || 1 时,要打印的参数是表达式 ("1") || 1。该表达式使用 PHP 的类型规则进行计算,如 true || truetrue。然后它被传递给 print 并且 - 完全巧合的是你试图打印的内容 - 被输入到字符串 "1".

然后 print 语句被视为返回 true 的表达式,而 ! 使其变为 false,因此 if 语句不会 运行.

这是不在 printrequireinclude 等关键字旁边使用圆括号的一个很好的理由 - 它们给人以“附加”参数的错误印象关键字。