[英]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.