邏輯運算子(Logical Operator)
邏輯運算是用來在流程控制時做邏輯判斷用的
邏輯運算的方式有以下4種:
範例 | 名稱 | 說明 | ||
---|---|---|---|---|
$a and $b / $a && $b | 且(And) | $a和$b都為TRUE時回傳TRUE | ||
$a or $b / $a **\ | \ | ** $b | 或(Or) | $a或$b任一為TRUE時回傳TRUE |
$a xor $b | 互斥(Xor) | $a和$b只有其中一方為TRUE時回傳TRUE | ||
! $a | 非(Not) | $a為FALSE時回傳TRUE |
其中且(And)和或(Or)有2種運算符號,2種運算符號執行的結果是一樣的,只差在「運算的優先順序」不同。
運算的優先順序請參考本章節的最後一篇文章 - 運算子優先順序
需要注意的是且(And)和或(Or)的運算方式是「短路運算」
請先看一下下面的範例
<?php
function printTrue() {
echo "TRUE";
return true;
}
function printFalse() {
echo "False";
return false;
}
//當判斷前面的部份能決定結果時, 就不會執行後面的部份
//由於&&/and要2個true,結果才是true,前面的false已經可以決定and的結果是false,後面的printTrue()就不會被執行了
(false && printTrue()); //不會執行到printTrue()
(false and printTrue()); //不會執行到printTrue()
//由於||/or要2個false,結果才是false,前面的true已經可以決定or的結果是true,後面的printFalse()就不會被執行了
(true || printFalse()); //不會執行到printFalse()
(true or printFalse()); //不會執行到printFalse()
//當判斷前面的部分尚未能確定結果時,後面的部分會被繼續執行
//and前面是true,需要運算完成後面的函數才能決定回傳值
(true and printTrue()); //output:TRUE
//or前面是false,需要運算完成後面的函數才能決定回傳值
(false or printFalse()); //output:FALSE
?>
可以看到&&/and
和||/or
在計算時,如果判斷前面的部分就已經能確定結果了,就不會執行後面的部份,藉此增加程式的效能
這就是所謂的「短路運算」
邏輯運算時強制轉型成布林值
另外,在進行邏輯運算時,非布林值會強制轉成布林值進行邏輯運算
在資料類型章節的布林值介紹文章中的「強制轉型成「布林值」的規則」,有提到非布林值強制轉型的規則
哪些情況轉型之後會是true
,哪些的結果是false
這部分在使用的時候需要多注意,否則會造成運算結果與預期的不同,導致程式碼出現bug