繁体   English   中英

为什么 if($x = 1 && $x == 1) 抛出错误但 if ($x == 1 && $x = 2) 不在 php 中?

[英]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以避免未定义变量通知。

其次,让我们确认运算符的优先级

  1. ==第一次应用
  2. &&第二次应用
  3. =第三次应用

这将返回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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM