簡體   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