[英]Why does if($x = 1 && $x == 1) throw error but if ($x == 1 && $x = 2) doesn't in php?
在 php 中,以下代码给出了未定义变量 $x的警告:
if($x = 1 && $x == 1)
我认为它等同于if( ($x = 1) && ($x == 1) )
,但事实并非如此。 有人告诉我,这是因为&&
的优先级高于=
,这导致表达式转换为:
if($x = (1 && ($x == 1)))
到目前为止一切顺利,但现在考虑:
$x=1; if($x == 1 && $x = 2)
这不会引发错误。 为什么不转换为:
$x=1; if( (($x == 1) && $x) = 2 )
有人告诉我那是因为=
是正确的关联性,但是https://www.php.net/manual/en/language.operators.precedence.php说当运算符具有相同的优先级时,它们的关联性决定了运算符的分组方式。 . 这里我们有=
, &&
和==
都具有不同的优先级。
附言; 我的实际代码是if($result != false && $res = $stmt->get_result())
,它是从其他一些有信誉的来源复制的,所以似乎不使用不必要的括号在 php 中很常见。
我玩过几个条件,下面是我所得到的。
首先,让我们考虑在if
语句之前初始化$x
以避免未定义变量通知。
其次,让我们确认运算符的优先级:
==
第一次应用&&
第二次应用=
第三次应用这将返回true
:
$x = 1;
if ($x = 1 && $x == 1) {
echo 'true';
} else {
echo 'false';
}
它就像($x = (1 && ($x == 1)))
-> ($x = (1 && true))
-> ($x = true)
-> true
。
如果我们将$x
与另一个值而不是分配的值进行比较,我们将得到false
:
$x = 1;
if ($x = 2 && $x == 2) {
echo 'true';
} else {
echo 'false';
}
它就像($x = (2 && ($x == 2)))
-> ($x = (2 && false))
-> ($x = false)
-> false
。
最后一个返回true
:
$x = 1;
if ($x == 1 && $x = 2) {
echo 'true';
} else {
echo 'false';
}
它就像((($x == 1) && $x) = 2)
-> ((true && $x) = 2)
-> (true = 2)
-> true
。
最后一个比较不能被 PHP 解释,所以它是一个大概的视图。
看起来最后一个动作(true = 2)
完全取决于左操作数。 如果我们把$x = 2;
我们将得到(false = 2)
-> false
。
我不确定最后一个,这是唯一可能发生错误的地方。
否则,看起来优先级按预期工作。
无论如何,我总是在if
运算符(尤其是在三元 if 中)中为赋值操作加上括号,以确保我会得到我期望的结果。 我不认为这对性能或可读性有太大影响,但它可能会防止一些逻辑错误。
更新:
关于您的代码if($result != false && $res = $stmt->get_result())
将其与if($x == 1 && $x = 2)
进行比较是不正确的,因为在您的代码中有两个不同的变量.
在这种情况下,如果第一个为false
,逻辑运算符根本不会调用第二部分,请参见此处的第一个示例
更新 2 :
在这个答案下的讨论之后我们可以看到最后的条件($x == 1 && $x = 2)
像(($x == 1) && ($x = 2))
-> ((1 == 1) && 2)
-> true
之后$x
变为 2。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.