2013-05-08 81 views
0

有時候主要是爲了處理用戶輸入,我發現自己使用了大量嵌套在對方中的IF語句,有時候它比下面多得多,直到從屏幕左側到if數字10右側的屏幕。替代嵌套的IF?

這是非常難以閱讀和排除故障,是否有其他方式做嵌套if?

我知道關於switch(),但在這種情況下,我必須做第三個查詢,而不是第一個。

if (true) { 

    if (true) { 

    if (true) { 
     ... 
     echo "You are logged in"; 
    } else { 
     echo "login failed" 
    } 

    } else { 
    echo "incorrect email"; 
    } 

} 
+0

這裏討論的各種技術:http://sourcemaking.com/refactoring/simplifying-conditional-expressions – Gordon 2013-05-08 20:34:39

回答

7

我假設你true條件是實際情況,而不僅僅是true布爾常量。

if (condition1 && condition2 && condition3) { 
    echo "You are logged in"; 
} else { 
    echo "login failed"; 
} 

如果你需要單獨處理的條件:

if (emailAddressIsCorrect) { 
    if (condition2 && condition3) { 
    echo "You are logged in"; 
    } else { 
    echo "login failed"; 
} else { 
echo "incorrect email"; 
} 

或者你可以返回早,這在我看來是清潔的。如果你喜歡,你可以爲每個條件做到這一點。你可以有很多條件,只要你想用這種安排,而不需要條件嵌套:

if (!emailAddressIsCorrect) { 
    echo "incorrect email"; 
    return; 
} 
1

很多時候,我會做,而不是「失敗去」戰略:

function login() { 
    if (!condition1) { 
     echo "incorrect email"; 
     return false; 
    } 

    if(!condition2) { 
     echo "incorrect password"; 
     return false; 
    } 

    if(condition3) { 
     echo "logged in successfully!"; 
     return true; 
    } 

    return false; 
} 

這個例子是犯罪嫌疑人,讓攻擊者知道登錄失敗的部分存在安全隱患,但作爲代碼片段,您可以看到策略。

+0

不能使用這個,因爲首先我需要看看登錄表單發佈之前我運行查詢,然後我看到如果電子郵件格式正確,然後只有我運行查詢和基於查詢我會輸出消息 – 2013-05-08 21:57:18

0

合併2條語句,使用「& &」。

OR

有時使用面向對象的編程就可以避免if語句:

if(is type a) { 
    dostuff1(); 
} else if(is type b) { 
    dostuff2(); 
} 

隨着類和繼承:

class->dostuff(); 

您還可以使用 「第一類函數」,以避免如果聲明。

假設你有值$ _ POST [ '頁'] == '第1頁',$ _ POST [ '頁'] == '第2頁'

$functions = array("page1"=>$function1, "page2"=>$function2); 

function dostuff1() { 
return 'a'; 
} 
function dostuff2() { 
return 'b'; 
} 

$function1 = "dostuff1"; 
$function2 = "dostuff2"; 

$functions[$_POST['page']](); 

,而不是

if($_POST['page'] == '1') dostuff1(); 

等...雖然這種方法有點可怕...笑

0

比較這:

if ($true1) { 
    if ($true2) { 
     if ($true3) { 
     ... 

與此:

if ($true1 && $true2 && $true3) { 
    ... 
} 

與第一appoach不僅你浪費有用的空間單個IF
你也推遲不可避免:後期優化

此外,它沒有物質(等性能),如果你把你的IFs爲嵌套或
在一個單一的線,因爲PHP intepreter將停止檢查以後,如果它發現
一個FALSE