我知道你的问题已经有六个答案,但没有一个使用简单的英语,所以我自己也会尝试。
让我们一步一步看这段代码,把它分成更小的部分,并准确地解释每一步。
无效的代码
首先你有这一行:
if ($_SESSION['userType'] != 'A' || $_SESSION['userType'] != 'S')
与其查看完整的 if 子句,不如将其分为两部分:
if ($_SESSION['userType'] != 'A')
if ($_SESSION['userType'] != 'S')
只要$_SESSION['userType'] 是A 以外的任何值,第一部分就会触发。
第二部分将在$_SESSION['userType'] 是除S 之外的任何值时触发。
现在,您已经使用“或”运算符将它们连接在一起,因此只要其中一个为真即可触发 if 子句。让我们看看当我们尝试时会发生什么。
我们将 $_SESSION['userType'] 设置为 'B' 并进入 if 子句。发生的第一件事是 PHP 查看第一部分 if ($_SESSION['userType'] != 'A'),并找到 'B' != 'A'。它不需要进入第二部分,因为它已经发现if语句的一部分为真,因此它决定完整的if语句也必须为真。
我们将 $_SESSION['userType'] 设置为 'A' 并进入 if 子句。发生的第一件事是 PHP 查看第一部分if ($_SESSION['userType'] != 'A'),发现'A' == 'A',所以第一部分为假。然后它继续到第二部分,即if ($_SESSION['userType'] != 'S'),并找到'A' != 'S'。由于这意味着 if 语句的一部分为真,它再次决定完整的 if 语句也必须为真。
现在请注意这意味着什么。即使您将'A' 发送到 if 子句,由于第二部分,它仍然会触发。如果您要发送'S',它将因为第一部分而触发。因此,基本上,无论$_SESSION['userType'] 设置为什么,都会触发完整的第一个 if 语句。这是一个重言式 - 它总是正确的。
有效的代码
这是完整的 if 语句:
if (!($_SESSION['userType'] == 'A' || $_SESSION['userType'] == 'S'))
我们暂时先忽略!,把它分成or操作符的两部分。
if ($_SESSION['userType'] == 'A')
if ($_SESSION['userType'] == 'S')
请注意,这与您所拥有的无效代码的逻辑相反。第一行表示“只接受'A'”,第二行表示“只接受'S'”。因此,此代码仅在您给它'A' 或'S' 时才会触发。
现在,如果你像以前一样在整个内容前面加上 ! 会发生什么?
! 运算符只是简单地反转它前面的内容。因此,这将含义从“A 或 S”更改为“既不是 A 也不是 S”。
总结
您的第一个示例归结为“任何价值”。
您的第二个示例归结为“任何值,但不是A,也不是S”。
如果您想了解更多基本逻辑,我建议您查看De Morgan's laws,正如您在上面的评论中所链接的那样。这将使您了解and 和or 如何组合在一起。