【问题标题】:PHP Logical Operators precedence affects variable assignment results strangelyPHP逻辑运算符优先级奇怪地影响变量赋值结果
【发布时间】:2012-02-12 11:05:59
【问题描述】:
$var4 = 123;

function fn1($p1)
{
    return array('p1' => 1, 'p2' => 2);
}

if ($var1 = fn1(1) AND $var4 == 123)
{
    print_r($var1);
}

if ($var2 = fn1(1) && $var4 == 123)
{
    print_r($var2);
}

if (($var3 = fn1(1)) && $var4 == 123)
{
    print_r($var3);
}
  1. 如果你运行这个简单的脚本,它会输出奇怪的结果,在 至少对我来说!!第一个 if 表达式的第一个输出将导致 从函数返回的数组并分配给 $var1 变量,这是我所期待的,嗯?
  2. 第二个输出如果表达式将产生一个整数 '1' 分配给 $var2 变量,这根本不是预期的! 请注意,唯一改变的是逻辑运算符, 我用的是'&&'而不是'AND',就是这样!!
  3. 第三个 if 表达式的第三个输出将再次产生预期的结果 从函数返回的数组并分配给 $var3 变量, 与第一个 if 表达式完全一样,但请稍等:我刚刚接受了 if 表达式中括号内的赋值语句,while 仍在使用第二个 if 表达式代码!!

谁能从技术上详细解释为什么会出现这种奇怪的行为? php.net 参考链接将不胜感激。

我知道 '&&' 的优先级高于 'AND' 但这并没有向我解释!!

【问题讨论】:

    标签: php variable-assignment logical-operators operator-precedence


    【解决方案1】:

    PHP: Operator Precendence

    && 的优先级高于 =,因此在第二个 if 中,您将 fn1(1) && $var4 == 123 的值(true 或 false)分配给 $var2。

    在第一个if中,AND的优先级低于=,所以先赋值,再比较结果。

    在第三个 if 中,分配首先再次发生,因为 parens 中的所有内容都首先得到处理。

    【讨论】:

      【解决方案2】:

      && 的优先级高于=,所以真正发生的事情更像是:

      if ($var1 = (fn(1) && $var4 == 123))
      

      所以真正分配给 $var1 的是布尔结果,这就是你得到 1 的原因。

      【讨论】:

        【解决方案3】:

        PHP 的 AND&& 运算符都是逻辑与,但 and 版本的绑定优先级较低,请参阅:http://php.net/manual/en/language.operators.precedence.php

        【讨论】:

          猜你喜欢
          • 2018-09-28
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2015-12-16
          • 2015-09-20
          • 2015-04-17
          • 2019-08-03
          相关资源
          最近更新 更多