php中的逻辑运算符

时间:2014-11-22 18:08:23

标签: php php-5.4

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

我的非工作代码:

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

如果我删除了||它有效。

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

任何提示?

4 个答案:

答案 0 :(得分:0)

您正在使用“not equals”运算符(!==)。如果您要测试值 login还是messages,则应使用==运算符:

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

答案 1 :(得分:0)

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

答案 2 :(得分:0)

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

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

因为当口译员评估$ _GET [' action']!==" login"并且$ _GET [' action']的值是'消息',该评估的结果为真,因此将执行if块中的代码。我建议您将代码更改为:

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

||改为&&这意味着$ _GET [' action']的值不能是' login'它不能是'消息'。

答案 3 :(得分:0)

好的,让我们检查你的if声明的执行情况:

  1. 假设,行动是 some_action 然后isset($_GET['action']) true $_GET['action'] !== "login" true
  2. 由于php有延迟执行(truetruetrue),比较停止了,doAction执行,很好,正是我们需要的。

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

    2. 最后假设,操作是消息 然后isset($_GET['action']) true $_GET['action'] !== "login" true 。考虑到延迟执行,doAction再次运行。

    3. 好!看起来doAction将始终有效!

      问题的解决方法是and (&&)

      使用or (||)代替if
      if (isset($_GET['action']) 
          && ($_GET['action'] !== "login" && $_GET['action'] !== "messages") ) 
          // that should work properly!