php的IF中的括号和赋值

时间:2014-11-27 11:34:09

标签: php

问题:

代码1和代码2有1个区别 - 括号。

我不明白为什么第一次导致错误而第二次没有。

代码1:

if
(
    $response = $myObject->response($request)
    && $response2 = $myObject->response($response) // PHP Notice: Undefined variable: response 
)

代码2:

if
(
    ($response = $myObject->response($request))
    && $response2 = $myObject->response($response) // Everything is OK
)

6 个答案:

答案 0 :(得分:3)

&&运算符的precedence运算符高于=

括号将评估的顺序更改为您想要的顺序,因为括号中的表达式首先被评估(就像在数学中一样)。

答案 1 :(得分:1)

通过给整个语句上的括号()定义范围,而在第一次检查中,它们是2个具有不同范围的独立检查。

if you define $response  above the if check, it will work as well.

( ) <-- They broaden the scope of the if check that is why it is visible in the second check.

答案 2 :(得分:1)

正如@baldrs所提到的,&&运算符(逻辑和运算符)比赋值运算符具有更高的precedence。在评估逻辑和。

之前,添加括号会强制评估赋值

答案 3 :(得分:1)

这是因为&&运算符的优先级高于=PHP运算符的优先级。同样在数学中应用BODMAS规则的意义,括号内的每个操作都是先完成的。 请参阅表格按{1}}的优先顺序列出运算符:

Operator Precedence

答案 4 :(得分:0)

第一个等于:

if (
    $response = (
        $myObject->response($request) &&
        ($response2 = $myObject->response($response)) // the $response is not defined here
    )
)

第二个等于:

if (
    ($response = $myObject->response($request))      // the $response is defined here
    && ($response2 = $myObject->response($response)) // so you can use it  
)

答案 5 :(得分:0)

正如其他几位已经说过的那样,&&的优先级高于=(这是分配,而非比较),而您的代码与if ($a = ($b && $c) = $d)相同(将您自己的表达式替换为$a $d .. $d)。

其内容为:“将$b && $c分配给$a,然后将其分配给$b && $c”。但$d是一个表达式,而不是变量,您不能将$d赋给它。就像你说“在2+2中存储if (($a = $b) && ($c = $d))”。

检查PHP手册中的operators precedence

如果你打算做作业,那就把它写成if ($a == $b && $c == $d),否则使用正确的比较运算符{{1}},你不需要使用括号。