【问题标题】:assignment and comparing in one expression在一个表达式中赋值和比较
【发布时间】:2018-04-01 10:48:06
【问题描述】:

伙计们。 我有以下代码块:

$a = true;

if($a === $b = true)
{
    echo 'ok';
}

这个脚本给出结果“ok”;

但是根据 http://php.net/manual/en/language.operators.precedence.php“===”运算符的优先级高于 “=”的优先级。而这个表达式 $a === $b = true 应该类似于 ($a === $b) = true 所以我希望应该抛出致命错误。 我的问题是:为什么它不会产生致命错误?我真的很困惑。

【问题讨论】:

    标签: php expression variable-assignment


    【解决方案1】:

    在文档中,您会发现以下注释:

    注意:

    虽然 = 的优先级低于大多数其他运算符,但 PHP 仍然会 允许类似于以下的表达式:if (!$a = foo()),在这种情况下,将 foo() 的 > 返回值放入 $a。

    所以在你的陈述中,$b 在与 $a 比较之前被赋值为 true。

    【讨论】:

      【解决方案2】:

      很好的问题。文档没有错,但是这里有一个特殊情况,它的优先级高于运算符优先级。

      在 if 语句中,PHP 在比较之前解析赋值,因为它需要知道赋值的结果才能将其与表达式的其余部分进行比较。

      如果你的 if 语句是根据运算符优先级解析的,你最终会得到:

      if ($a === $b = true)
      -> if (($a === $b) = true)
      -> fatal error because PHP would not be able to store the result of the assignment
      

      赋值的左侧必须指向 PHP 可以存储结果的内存地址。基本上,= 的左边必须是变量名。由于运算符优先级规则会破坏 if 语句中的(更重要的)规则,因此 PHP 实际上 会按如下方式解析您的 if 语句:

      if ($a === $b = true)
      -> if ($a === ($b = true))   // now the assignment is valid
      -> if ($a === true)
      -> if (true === true)
      -> if (true)
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2013-08-29
        • 1970-01-01
        • 2022-08-03
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多