【问题标题】:assignment and comparing in one expression在一个表达式中赋值和比较
【发布时间】:2018-04-01 10:48:06
【问题描述】:
【问题讨论】:
标签:
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)