人。 我有以下代码块:
$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 所以我预计应该抛出致命的错误。 我的问题是:为什么它不会产生致命错误?我真的很困惑。
答案 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)