[PHP] 德摩根定律 (De Morgan's Laws) 與 PHP 實戰應用
在程式開發的世界裡,邏輯判斷(Logic)是我們的基本功。但你是否曾經在寫 if 判斷式時,為了那層層疊疊的括號和驚嘆號 ! 而感到頭暈目眩?
特別是當你需要對一個「複雜條件」進行「反向思考」時,很容易就會寫出連自己過兩週後都看不懂的程式碼。這時候,德摩根定律 (De Morgan's Laws) 就是你的救星。
什麼是德摩根定律?
簡單來說,德摩根定律是用來處理「邏輯非(NOT)」、「邏輯且(AND)」與「邏輯或(OR)」之間轉換關係的規則。它主要有兩條定律,轉換成工程師熟悉的語言就是:
!(A && B) 等同於 !A || !B
翻譯:「並非(A 且 B)」 等於 「非 A 或者 非 B」
!(A || B) 等同於 !A && !B
翻譯:「並非(A 或 B)」 等於 「非 A 且 非 B」
口訣很簡單:把 ! 丟進括號裡,&& 變 ||,|| 變 &&。
PHP 實戰應用範例
讓我們來看看在 PHP 開發中,如何運用這個定律來讓程式碼更乾淨。
案例一:使用者登入權限檢查
假設我們要判斷一個使用者「不能登入」的情況。登入成功的條件是:帳號存在 (Exists) 且 密碼正確 (Correct)。
如果不使用德摩根定律,我們可能會直覺地寫出這樣的否定判斷:
// 寫法 A:直覺但層次較深
if ( !($userExists && $passwordCorrect) ) {
return '登入失敗';
}
雖然邏輯正確,但人類的大腦在處理「非(A 且 B)」這種邏輯時比較費力。運用德摩根定律第一條 !(A && B) => !A || !B,我們可以將其重構為:
// 寫法 B:更符合語意的線性思考
if (!$userExists || !$passwordCorrect) {
return '登入失敗';
}
解讀:如果「帳號不存在」或者「密碼不正確」,則登入失敗。這樣的語意是不是直觀多了?
案例二:商品上架檢查
假設一個電商網站的商品要顯示在架上,必須滿足兩個條件之一:是新品 (New) 或者 是熱銷品 (Hot),否則就隱藏。
原本的寫法(檢查是否需要隱藏):
// 寫法 A:括號內的邏輯容易看錯
if ( !($isNew || $isHot) ) {
$product->hide();
}
運用德摩根定律第二條 !(A || B) => !A && !B 重構:
// 寫法 B:清楚列出所有「隱藏」的條件
if (!$isNew && !$isHot) {
$product->hide();
}
解讀:如果「不是新品」且「不是熱銷品」,那就隱藏。這種寫法消除了對括號範圍的依賴,減少了閱讀程式碼時的認知負擔。
結語
對於初級工程師來說,能寫出「機器跑得動」的程式碼是第一步,但能寫出「人類讀得懂」的程式碼才是進階的關鍵。
下次當你在 PHP 中看見 !($a && $b) 這種結構時,不妨試著用德摩根定律將它展開。這不僅能減少括號的使用,往往也能讓商業邏輯的意圖更加清晰。