2012-08-07 223 views
11

我想知道當它是一個壞主意使用多個嵌套的IF語句。PHP - 嵌套的IF語句

如:

function change_password($email, $password, $new_password, $confirm_new_password) 
{ 
    if($email && $password && $new_password && $confirm_new_password) 
    { 
     if($new_password == $confirm_new_password) 
     { 
      if(login($email, $password)) 
      { 
       if(set_password($email, $new_password)) 
       { 
        return TRUE; 
       } 
      } 
     } 
    } 
}  

該功能用於這樣的:

​​

我把我所有的功能這樣的,我想知道如果有什麼問題我的編碼風格。我有我的疑惑,因爲如果我遵循這個設計,那麼意味着我寫的每一個函數都會與IF一起嵌套,檢查每個階段是否存在錯誤。這是其他人做的嗎?

我沒有看到許多其他的腳本是這樣寫的,嵌套的IF做出了三角形形狀,只在中間有所需的結果。如果中間沒有達到,那麼就搞砸了。

這是一個很好的功能結構嗎?

+0

你可以簡單地將它們全部添加到一個if語句中,或者保留它,因爲它是爲了讓自己清楚,它的所有關於個人品味 – Hawili 2012-08-07 04:30:44

回答

29

嵌套過深通常是一個壞主意 - 它是意大利麪條的邏輯和難以遵循。因爲你的每一個驗證步驟取決於前級已經成功了,不要窩在所有 - 剛剛擺脫困境,當一個階段失敗:

function change_password(blah blah blah) { 
    if (!$condition1) { 
     return false; 
    } 
    if (!$condition2) { 
     return false; 
    } 
    etc.... 


    // got here, must have succeeded 
    return true; 
} 

這使得它明確清晰的邏輯順序是什麼。

2

我認爲這絕對是好讀,可以很容易地在比較可以理解爲只使用一個if聲明像

if (blah and blah and blah and blah and blah and blah and blah) {} 

不過我還是更喜歡做這種方式 - 太多的縮進可以得到有點兒討厭:

function change_password($email, $password, $new_password, $confirm_new_password) 
{ 
    if (!$email || !$password || !$new_password || !$confirm_new_password) return false; 
    if ($new_password != $confirm_new_password) return false; 
    if (!login($email, $password)) return false; 
    if (!set_password($email, $new_password)) return false; 

    return true; 
} 
1

它可以很好地嵌套它們,因爲通過改變順序可以避免進行額外的比較。你現在正在做的很好看,但是你的功能將是低效率的,如果你不是寫爲:

function change_password($email, $password, $new_password, $confirm_new_password) 
{ 
    if($new_password == $confirm_new_password && $email && $password && $new_password && $confirm_new_password) 
    { 
     if(login($email, $password)) 
     { 
      if(set_password($email, $new_password)) 
      { 
       return TRUE; 
      } 
     } 

    } 
} 

如果$ NEW_PASSWORD == $ confirm_new_password是真實的,但$電子郵件是空的,你會做了一個額外比較。

正如其他人所說,還有其他方法可以解決這個問題,而不會嵌套一切,這在功能上是等同的。