29

否定运算符的优先级高于赋值运算符,为什么它在表达式中较低?

例如

if (!$var = getVar()) {

在前面的表达式中,赋值首先发生,否定发生在后面。不应该先否定,然后赋值吗?

4

3 回答 3

47

的左侧= 必须是variable. $var是一个variable,而!$var不是(它是一个expr_without_variable)。

因此 PHP 以唯一可能的方式解析表达式,即 as !($var = getVar())。优先权永远不会在这里发挥作用。

的优先级相关的示例=如下:

$a = $b || $c // ==> $a = ($b || $c), because || has higher precedence than =
$a = $b or $c // ==> ($a = $b) or $c, because or has lower precedence than =
于 2013-02-28T20:03:17.510 回答
4

简而言之,赋值总是优先于它们的左边部分 (因为在相反的情况下会导致解析错误)。

 <?php
 $b=12 + $a = 5 + 6;
 echo "$a $b\n";
 --> 11 23

 $b=(12 + $a) = (5 + 6);
 echo "$a $b\n";
 --> Parse error

PHP文档现在有一个关于这个问题的注释:http: //php.net/manual/en/language.operators.precedence.php (我猜它是在你的问题之后添加的)

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

于 2015-09-22T08:38:33.033 回答
0

协商操作员需要在下一次检查单个值,所以如果你这样给出

!$var = getVar()

该运算符仅适用于下一个变量,因此 !$var 将分开。所以我们只需要付出

!($var = getVar())

于 2015-09-24T06:33:04.843 回答