否定运算符的优先级高于赋值运算符,为什么它在表达式中较低?
例如
if (!$var = getVar()) {
在前面的表达式中,赋值首先发生,否定发生在后面。不应该先否定,然后赋值吗?
否定运算符的优先级高于赋值运算符,为什么它在表达式中较低?
例如
if (!$var = getVar()) {
在前面的表达式中,赋值首先发生,否定发生在后面。不应该先否定,然后赋值吗?
的左侧=
必须是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 =
简而言之,赋值总是优先于它们的左边部分 (因为在相反的情况下会导致解析错误)。
<?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
协商操作员需要在下一次检查单个值,所以如果你这样给出
!$var = getVar()
该运算符仅适用于下一个变量,因此 !$var 将分开。所以我们只需要付出
!($var = getVar())