PHP中&&與and、||與or的區別 | php中and 和 &&出坑指南

     在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

$bA = true;

$bB = false;

$b1 = $bA and $bB;

$b2 = $bA && $bB;

var_dump($b1); // $b1 = true

var_dump($b2); // $b2 = false

$bA = false;

$bB = true;

$b3 = $bA or $bB;

$b4 = $bA || $bB;

var_dump($b3); // $b3 = false

var_dump($b4); // $b4 = true

奇怪吧, and/&&和or/||出來的結果竟然不一樣的. 問題出在哪裏呢?
我們再看一段代碼!

?

1

2

3

4

5

6

7

8

$bA = true;

$bB = false;

var_dump($bA and $bB); // false

var_dump($bA && $bB); // false

$bA = false;

$bB = true;

var_dump($bA or $bB); // true

var_dump($bA || $bB); // true

更奇怪, 這時怎麼是對的. 所以問題可能出現在=上, 一番google和文檔,終於找到了答案!

運算符優先級

通過這個表, 我們可以看到 and/&& 和 or/|| 這兩組運算符的優先級竟然是不一樣的. and和or的優先級是低於=的, 所以上面的代碼就好理解了, 就是先做賦值然後再做了一個and或or的邏輯運算, 這個運算的結果並沒有存下來. 所以最後出來讓我們匪夷所思的結果.

結合性 運算符 額外信息
無結合性 clone new 克隆和new
[ 數組
** 算術
++ — ~ (int) (float) (string) (array) (object) (bool) @ 類型和自增/自減
無結合性 instanceof 類型
! 邏輯運算
* / % 算術
+ – . 算術和字符串
<< >> 按位運算
無結合性 < <= > >= 比較運算
無結合性 == != === !== <> 比較運算
& 按位運算和引用
^ 按位運算
| 按位運算
&& 邏輯運算
| | 邏輯運算
?: 三元條件選擇
= += -= *= /= .= %= &= = ^= <<= >>= => | 賦值
and 邏輯運算
xor 邏輯運算
or 邏輯運算
, 很多使用

 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章