问题:
代码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
)
答案 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}}的优先顺序列出运算符:
答案 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}},你不需要使用括号。