PHP 標誌

PHP 標誌

本文章介紹 PHP 的「 AND 和 && 」 及 「 OR 和 || 」 的分別。

在編寫PHP程式時,部份開發者習慣使用「&&」和「||」這兩個邏輯運算符;部份開發者則習慣使用「AND」和「OR」這兩個邏輯運算符。在開始介紹兩者分別之前,請先看看以下的代碼。

$bear = false;
$panda = true;

$koala = $panda AND $bear;
$firefox = $panda && $bear;

$teddy = $bear OR $panda;
$freddy = $bear || $panda;

大家知道 $koala , $firefox, $teddy 和 $freddy 的數值嗎?我們把 4 個數值輸出,會得到以下結果。

echo '$koala = ' . (int) $koala . '<br />'; // 1 (true)
echo '$firefox = ' . (int) $firefox . '<br />'; // 0 (false)
echo '$teddy = ' . (int) $teddy . '<br />'; // 0 (false)
echo '$freddy = ' . (int) $freddy . '<br />'; // 1 (true)

AND 和 && 的分別

AND 和 && 都是「邏輯與」,兩者唯一的分別是運行的優先次序(Operator Precedence)不同。「&&」的優先次序比「=」高,而「=」的優先次序比「AND」高。詳細的優先次序可參考PHP手冊

在執行「$koala = $panda AND $bear;」時,由於「=」的優先次序比「AND」高,「$koala = $panda」會先執行,然後才執行「AND」的部分。因此, $koala 的數值是 true 。

而在執行「$firefox = $panda && $bear;」時,因為「&&」的優先次序比「=」高,「$panda && $bear」會優先執行,然後才執行「=」的部分。因此, $koala 的數值是 false 。

如果需要使用「AND」來提高代碼的可續性,請使用括號——「(」和「)」來處理。

$koala = $panda AND $bear; // 1 (true)
$firefox = $panda && $bear; // 0 (false)
$henry = ($panda AND $bear); // 0 (false)

OR 和 || 的分別

OR 和 || 都是「邏輯或」,兩者唯一的分別是運行的優先次序(Operator Precedence)不同。「||」的優先次序比「=」高,而「=」的優先次序比「OR」高。詳細的優先次序可參考PHP手冊

在執行「$teddy = $bear OR $panda;」時,由於「=」的優先次序比「OR」高,「$teddy = $bear」會先執行,然後才執行「OR」的部分。因此, $teddy 的數值是 false 。

而在執行「$freddy = $bear || $panda;」時,因為「||」的優先次序比「=」高,「$bear || $panda」會優先執行,然後才執行「=」的部分。因此, $freddy 的數值是 true 。

如果需要使用「OR」來提高代碼的可續性,請使用括號——「(」和「)」來處理。

$teddy = $bear OR $panda; // 0 (false)
$freddy = $bear || $panda; // 1 (true)
$beddy = ($bear OR $panda); // 1 (true)

挑戰

大家可以嘗試推斷出以下3個變數 $quiz 、 $test 和 $exam 的數值嗎?

$bear = false;
$panda = true;

$quiz = $panda AND $bear && $panda || $bear OR $panda && $bear;
$test = $panda && $bear AND $panda OR $bear || $panda AND $bear;
$exam = ($panda || $bear || $panda AND $panda OR $bear && $panda && $bear);

$quiz 的數值是 true 。我們看看變數 $quiz 是如何評估出來的。

$quiz = $panda AND $bear && $panda || $bear OR $panda && $bear;

// && 擁有最高的優先次序
$quiz = $panda AND false || $bear OR $panda && $bear;
// && 擁有較高的優先次序
$quiz = $panda AND false || $bear OR false;
// || 擁有較高的優先次序
$quiz = $panda AND false OR false;
// = 擁有較高的優先次序
$quiz = true;
//...

$test 的數值是 false 。我們看看變數 $test 是如何評估出來的。

$test = $panda && $bear AND $panda OR $bear || $panda AND $bear;

// && 擁有最高的優先次序
$test = false AND $panda OR $bear || $panda AND $bear;
// || 擁有較高的優先次序
$test = false AND $panda OR true AND $bear;
// = 擁有較高的優先次序
$test = false;
//...

$exam 的數值是 true 。我們看看變數 $exam 是如何評估出來的。

$exam = ($panda || $bear || $panda AND $panda OR $bear && $panda && $bear);

// && 擁有最高的優先次序
$exam = ($panda || $bear || $panda AND $panda OR false && $bear);
// && 擁有較高的優先次序
$exam = ($panda || $bear || $panda AND $panda OR false);
// || 擁有較高的優先次序
$exam = (true || $panda AND $panda OR false);
// || 擁有較高的優先次序
$exam = (true AND $panda OR false);
// 雖然 = 擁有較高的優先次序,但是括號內的內容會優先評估,因此 AND 會先執行
$exam = (true OR false);
// 雖然 = 擁有較高的優先次序,但是括號內的內容會優先評估,因此 OR 會先執行
$exam = (true);

總結

運算符號的優先次序是代碼執行先後次序的重要因素。不當的使用運算符號會導致程序出現 Bugs 。無論使用「 AND 和 OR 」 還是 「 && 和 || 」,也是沒有問題的。而使用「 AND 和 OR 」時要注意運算符號的優先次序,並且使用適當的「括號」確保正確的運算次序。