分配和比较一个表达式

时间:2017-10-20 09:26:00

标签: php expression variable-assignment

人。 我有以下代码块:

$a = true;

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

这个脚本给出结果" ok&#34 ;;

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

2 个答案:

答案 0 :(得分:1)

在文档中,您将找到以下注释:

  

注意:

     

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

因此,在你的陈述中,$ b在与$ a的比较之前被赋予真。

答案 1 :(得分:0)

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

在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)