2014-09-01 60 views
0

我正在繼承遺留代碼,我遇到過這段代碼。無嵌套大括號的PHP嵌套else語句

  • This Code works!
  • 忽略變量名看{第一個條件打開但從不關閉else沒有打開?它仍然有效?
  • 它是繼續在兩個或只有一個條件,如果哪一個?
  • 爲什麼它甚至工作?

    foreach($bla as $foo) { 
    
        if(condition) { 
        if(condition) { 
        // Do Something 
        }else 
        continue; 
        } 
    
    } 
    

我的假設是內部條件將使用別的嗎?但我只是假設,因爲這個答案:Nested if-else behaviour without braces我無法找到一個明確的答案PHP

+0

'忽略變量名稱看'\'{\'第一個條件打開,但從來沒有關閉其他沒有打開?它仍然有效?'哦,但它確實關閉(第二個到最後一個關閉'}')。 – Cthulhu 2014-09-01 09:17:37

+0

這裏的關鍵在於[a * single *語句不必被包裹在大括號中](http://php.net/manual/en/control-structures.if.php)。你的'continue'行等同於'{continue; }'。我想假設你的其他困惑就在於縮進。我個人建議使用大括號即使是一個單一的聲明,但這可能仍然被認爲是一個宗教問題。 – 2014-09-01 09:19:53

回答

6

您可以改寫代碼(用正確的縮進使用):

foreach($bla as $foo) { // FOREACH 
    if(condition) {  // IF#1 
     if(condition) {  // IF#2 
      // Do Something 
     } else continue; // END IF#2 
    }      // END IF#1 
}       // END FOREACH 

現在回答你的問題:

它是繼續在兩個或只有一個條件,如果哪一個?

它是continue僅當嵌套if()(IF#2)語句條件評價爲false荷蘭國際集團。

它爲什麼能工作?

它的工作原理,因爲if()允許語法,而不括號內爲簡單的操作。參見手冊中的示例1。因此嵌套if()完全由continue關閉操作與以下分隔符;

4

是的,else適用於內部條件。代碼編譯,因爲else塊沒有開放支撐,所以大括號仍然是平衡的。這裏是相同的代碼正確縮進:

foreach($bla as $foo) { 
    if(condition) { 
     if(condition) { 
      // Do Something 
     } 
     else 
      continue; 
    } 
} 

當然,這是不一致的,並且是一種非常糟糕的方式來編寫此代碼。

2

當然,這意味着如果第一個IF條件爲真,它將轉到第二個IF條件。

所以第二個IF條件只有在第一個條件爲真時纔會被讀取。

foreach($bla as $foo) { 

    if(condition) { 
     if(condition) { 
      // Do Something 
     }else continue; 
    } 

} 
2

如果「其他」(或者,如果是這樣的話)是單行的,則不需要大括號。問題中的「其他」繼續內在的「如果」。