不是多个或运算符的运算符

时间:2013-11-28 06:15:08

标签: php logic

我对以下代码感到困惑:

无效的拳头代码:

if ($_SESSION['userType'] != 'A' || $_SESSION['userType'] != 'S')
{
    redirect('dashboard.php');
}

正在运行的第二个代码:

if (!($_SESSION['userType'] == 'A' || $_SESSION['userType'] == 'S'))
{
    redirect('dashboard.php');
}

两个代码之间有什么区别?

4 个答案:

答案 0 :(得分:2)

我知道你的问题已经有六个答案,但是没有一个使用普通英语,所以我也会自己尝试。

让我们一步一步地看一下这段代码,把它分成更小的部分,并准确地解释每一步。


无效的代码

首先你有这一行:

if ($_SESSION['userType'] != 'A' || $_SESSION['userType'] != 'S')

不要再查看完整的if子句,而是将其分为两部分:

  1. if ($_SESSION['userType'] != 'A')
  2. if ($_SESSION['userType'] != 'S')
  3. 第一部分将触发$_SESSION['userType']A以外的任何值的任何时间。

    第二部分将触发$_SESSION['userType']S以外的任何值的任何时间。

    现在,您已经将它们与“or”运算符一起加入它们,因此只要触发if子句,其中一个就足够了。让我们看看当我们尝试时会发生什么。

    1. 我们将$_SESSION['userType']设置为'B'并进入if子句。首先发生的是PHP查看第一部分if ($_SESSION['userType'] != 'A'),并找到'B' != 'A'。它不需要转到第二部分,因为它已经发现if语句的一部分是真的,因此它确定完整的if语句也必须为真。

    2. 我们将$_SESSION['userType']设置为'A'并进入if子句。首先发生的是PHP查看第一部分if ($_SESSION['userType'] != 'A'),并找到'A' == 'A',因此第一部分是false。然后继续进行第二部分if ($_SESSION['userType'] != 'S'),找到'A' != 'S'。因为这意味着if语句的一个部分为true,所以它再次确定完整的if语句也必须为true。

    3. 现在注意这意味着什么。即使您向if子句发送'A',它仍会因第二部分而触发。如果您要发送'S',则会因为第一部分而触发。基本上,无论$_SESSION['userType']设置为什么,都会触发完整的第一个if语句。这是一个重言式 - 它总是如此。


      正在运行的代码

      这是你的完整if语句:

      if (!($_SESSION['userType'] == 'A' || $_SESSION['userType'] == 'S'))

      我们暂时忽略!,并将其划分为or运算符的两个部分。

      1. if ($_SESSION['userType'] == 'A')
      2. if ($_SESSION['userType'] == 'S')
      3. 请注意,这与您没有工作的代码完全相反。第一行表示“仅接受'A'”,第二行表示“仅接受'S'”。因此,如果您提供'A''S',此代码将仅触发

        现在,如果你把!放在整个事物的前面,会发生什么呢?

        !运算符只是反转它放在前面的任何内容。因此,这会将含义从“AS”改为“既不A也不S”。


        <强>摘要

        你的第一个例子归结为“任何价值”。

        您的第二个示例归结为“任何值,但不是A,也不是S”。

        如果您想了解更多基本逻辑,我建议您查看De Morgan's laws,就像您在上面的评论中所链接的一样。这将使您了解andor如何结合在一起。

答案 1 :(得分:1)

...不相当。

如果我正确记住布尔逻辑,则错误在于操作顺序。

if ($_SESSION['userType'] != 'A' || $_SESSION['userType'] != 'S') {

如果userType等于A,这将不起作用...因为第一个操作是检查它不等于A而OR是从左到右...所以如果第一个不是真的,那么整个语句是假的。

您的第二种方法转换为:

if (!($_SESSION['userType'] == 'A' || $_SESSION['userType'] == 'S'))
{
    redirect('dashboard.php');
}

如果不是userType等于A OR userType等于S,这就是它按你的意愿工作的原因。

尝试

if ($_SESSION['userType'] != 'A' && $_SESSION['userType'] != 'S')) {

表示IF userType不是A而userType不是S

我认为这会给你你想要的东西。 IE如果userType既不是A,也不是S,只执行循环中的操作。

答案 2 :(得分:0)

if ($_SESSION['userType'] != 'A' || $_SESSION['userType'] != 'S') {

或多或少等同于

if (!($_SESSION['userType'] == 'A' && $_SESSION['userType'] == 'S')) {

答案 3 :(得分:-1)

第一个无效的代码

if ($_SESSION['userType'] != 'A' || $_SESSION['userType'] != 'S')
{
    redirect('dashboard.php');
}

让我们简单地把它当作:

if (true || true) //the condition will be true or vice versa
{
    redirect('dashboard.php');
}

正在运行的第二个代码:

if (!($_SESSION['userType'] == 'A' || $_SESSION['userType'] == 'S'))
{
    redirect('dashboard.php');
}

和简化版:

if (!(true || true)) same as if (!(true)) //i.e. false or vice versa
{
    redirect('dashboard.php');
}

所以基本上一个是真的,另一个是假的,反之亦然,这就是为什么他们的行为是差异的。