php 中的逻辑运算符


Logical operators in php

我不明白这一点。如果设置了 $_GET['action'] 并且操作不是"登录"或不是"消息",我想做 Action()。

我的非工作代码:

if ( isset($_GET['action']) &&  ($_GET['action'] !== "login" || $_GET['action'] !== "messages") )     {
   doAction();
}

如果我删除||它有效。

if ( isset($_GET['action']) &&  ($_GET['action'] !== "login") ) {
   doAction();
}

有什么提示吗?

好的,让我们检查一下您的if语句的执行情况:

  1. 假设,行动是some_action那么isset($_GET['action'])真的$_GET['action'] !== "login"是真的

由于 php 具有延迟执行(true并且true true),比较停止并且您的doAction执行,很好,正是我们所需要的。

  1. 假设,操作是登录那么isset($_GET['action'])真的$_GET['action'] !== "login"的,$_GET['action'] !== "messages"是真的(因为登录绝对不是消息)。所以(true和(falsetrue))是true

  2. 最后假设,行动就是消息那么isset($_GET['action'])真的$_GET['action'] !== "login"是真的。考虑到延迟执行,您的doAction会再次运行。

好!看起来doAction将永远有效!

解决此问题的方法是在if中使用and (&&)而不是or (||)

if (isset($_GET['action']) 
    && ($_GET['action'] !== "login" && $_GET['action'] !== "messages") ) 
    // that should work properly!

您正在使用"不等于"运算符(!==)。如果要测试该值是login还是messages,则应使用 == 运算符:

if ( isset($_GET['action']) && 
     ($_GET['action'] == "login" || $_GET['action'] == "messages") ) {
   doAction();
}
if ( isset($_GET['action']) && 
     ($_GET['action'] !== "login" || $_GET['action'] !== "messages") ) {
   doAction();
}

当使用 ||| 在 PHP 中测试条件时,PHP 将按照条件的编写顺序测试条件,如果其中一个为真,则整个条件的计算结果为 true。这意味着,对于您的代码,如果 $_GET['action'] 的值是 'messages',则条件的计算结果为 true:

if ( isset($_GET['action']) &&  ($_GET['action'] !== "login" || $_GET['action'] !== "messages") ){
   doAction();
}

因为当解释器计算 $_GET['action'] !== "login" 并且 $_GET['action'] 的值是 'messages' 时,该求值的结果为 true,因此 if 块中的代码将被执行。我建议您将代码更改为:

if ( isset($_GET['action']) &&  ($_GET['action'] !== "login" && $_GET['action'] !== "messages") ){
   doAction();
}

|| 更改为 &&,这意味着 $_GET['action'] 的值不能是"登录",也不能是"消息"。