在PHP中,&&與and都表示邏輯與,||與or都表示邏輯或,並且它們都是短路運算符。而它們的區別在於運算的優先級不同。
<?php
$t1=true and false;
$t2=true && false;
var_dump($t1,$t2);
?>
在上面的代碼中$t1的值爲true,$t2的值爲false。因爲運算符and、=、&&的優先級爲&&>=>and,所以在執行第一行時,會先將true賦值給t1,false被忽略。而第二行代碼會先進行&&運算,然後將運算的結果false,賦值給t2。
同樣對於||和or。運算符or、=、||的優先級爲||>=>or。下面代碼運行後,$t1的值爲false,$2的值爲true。
<?php
$t1=false or true;
$t2=false || true;
var_dump($t1,$t2);
?>
-----------------------------------------------------------------------------------------------------------------------------------------------------------
表達式 && 表達式
前面的表達式爲真,則接着執行後面的表達式;
$user = 2;
$user && $password = 1;
echo $user,'|',$password;
前面的爲假,則後面的表達式不執行。
$user = false;
$user && $password = 1;
echo $user,'|',$password;
表達式 || 表達式
前面的表達式爲真,則後面的不執行;
$user = 2;
$user || $password = 1;
echo $user,'|',$password;
前面爲假,則執行後面的
$user = 0;
$user || $password = 1;
echo $user,'|',$password;
-----------------------------------------------------------------------------------------------------------------------------------------------------
我原來以爲PHP中的and和&&是一樣的, 只是寫法上爲了可讀性和美觀, 事實上我錯了. 這裏面深藏了一個坑!
看以下代碼:
1 2 3 4 5 6 7 8 9 10 11 12 |
|
奇怪吧, and/&&和or/||出來的結果竟然不一樣的. 問題出在哪裏呢?
我們再看一段代碼!
1 2 3 4 5 6 7 8 |
|
更奇怪, 這時怎麼是對的. 所以問題可能出現在=上, 一番google和文檔,終於找到了答案!
運算符優先級
通過這個表, 我們可以看到 and/&& 和 or/|| 這兩組運算符的優先級竟然是不一樣的. and和or的優先級是低於=的, 所以上面的代碼就好理解了, 就是先做賦值然後再做了一個and或or的邏輯運算, 這個運算的結果並沒有存下來. 所以最後出來讓我們匪夷所思的結果.
結合性 | 運算符 | 額外信息 |
---|---|---|
無結合性 | clone new | 克隆和new |
左 | [ | 數組 |
左 | ** | 算術 |
右 | ++ — ~ (int) (float) (string) (array) (object) (bool) @ | 類型和自增/自減 |
無結合性 | instanceof | 類型 |
右 | ! | 邏輯運算 |
左 | * / % | 算術 |
左 | + – . | 算術和字符串 |
左 | << >> | 按位運算 |
無結合性 | < <= > >= | 比較運算 |
無結合性 | == != === !== <> | 比較運算 |
左 | & | 按位運算和引用 |
左 | ^ | 按位運算 |
左 | | 按位運算 | |
左 | && | 邏輯運算 |
左 | | | 邏輯運算 | |
左 | ?: | 三元條件選擇 |
右 | = += -= *= /= .= %= &= | = ^= <<= >>= => | 賦值 |
左 | and | 邏輯運算 |
左 | xor | 邏輯運算 |
左 | or | 邏輯運算 |
左 | , | 很多使用 |