2010-11-11 30 views
5

स्विच स्टेटमेंट में केस विकल्प कैसे आते हैं जिसमें बिना किसी जांच के अगले मामले में स्वचालित रूप से ब्रेक नहीं होता है?ब्रेक के बिना स्विच स्टेटमेंट

try { 
    switch($param) { 
     case "created": 
      if(!($value instanceof \DateTime)) 
       throw new \Exception("\DateTime expected, ".gettype($value)." given for self::$param"); 
     case "Creator": 
      if(!($value instanceof \Base\User)) { 
       throw new \Exception(get_class($value)." given. \Base\User expected for self::\$Creator");     
      } 
     default: 
      $this->$param = $value; 
      break; 
    } 
} catch(Exception $e) { 
    echo $e->getMessage(); 
} 

यदि परम "बनाया गया" है तो यह बनाए गए मामले में चेक करेगा, जो अच्छा है। जब चेक सफल होता है, तो मैं चाहता हूं कि कोड डिफ़ॉल्ट विकल्प पर जारी रहे, इसलिए कोई ब्रेक नहीं है; लेकिन इसके बजाय यह "निर्माता" जारी है जबकि $ param! = "निर्माता"!

मुझे पता है कि इसे कैसे हल करें (केवल मेरे बनाए गए "मामले में डिफ़ॉल्ट कोड जोड़ें), लेकिन मैं उस कोड को अक्सर दोहराना पसंद नहीं करता। मेरा वास्तविक सवाल यह है: यह "निर्माता" केस के साथ क्यों जारी रहता है जबकि मामला "निर्माता" नहीं है।

उत्तर

16

Fallthrough की तरह कोड अनुमति देने के लिए एक जानबूझकर डिजाइन विशेषता थी।

default किसी अन्य तरह के मामले, कि कूद को छोड़कर वहाँ होता है अगर कोई अन्य मामला शुरू हो गया था। यह किसी भी माध्यम से नहीं है "वास्तविक चयनित केस चलाने के बाद ऐसा करें" निर्देश। अपने उदाहरण में, आप विचार कर सकते हैं:

switch($param) { 
    case "created": 
     if(!($value instanceof \DateTime)) 
      throw new \Exception("\DateTime expected, ".gettype($value)." given for self::$param"); 
     break; 
    case "Creator": 
     if(!($value instanceof \Base\User)) { 
      throw new \Exception(get_class($value)." given. \Base\User expected for self::\$Creator");     
     } 
     break; 
} 

$this->$param = $value; 

अंगूठे का नियम यहाँ है, अगर यह स्विच पर निर्भर नहीं करता है, यह स्विच से बाहर चले जाते हैं।

+0

वाह, मैं इसे कैसे याद कर सकता था। : डी +1 – Ruel

+0

महान जवाब! धन्यवाद! –

+0

मैं इसे जोड़ दूंगा - जबकि फॉल-थ्रू कभी-कभी उपयोगी होता है - इसका उपयोग नहीं करना बेहतर होता है, जहां दोनों मामले सिर्फ गिरने के बजाय कुछ करते हैं (अच्छा: 'मामला "बनाया गया": केस "निर्माता": केस "something_else": do_stuff(); 'खराब:' मामला "बनाया गया": do_stuff(); केस "निर्माता": do_Second_stuff(); केस "something_else": do_remaining_stuff(); ') – dbemerlin

1

क्योंकि यह in C किया गया है।

0

अपने "वास्तविक सवाल" जवाब देने के लिए: यह "निर्माता" मामले के साथ क्यों जारी रखने के लिए करता है, जबकि मामले "निर्माता" नहीं है।

क्योंकि आप break जरूरत नहीं है। इसके बिना, यह इसके नीचे के मामलों को जारी रखेगा। एकमात्र समाधान जो मैं सोच सकता हूं वह आपके डिफ़ॉल्ट कोड को मामलों में डाल रहा है, और break जोड़ें।

इसके अलावा, आप स्विच ब्लॉक में अपने पिछले मामले के बाद से डिफ़ॉल्ट मामले पर break जरूरत नहीं है।

switch ($command) { 
    case "exit": 
    case "quit": 
    quit(); 
    break; 
    case "reset": 
    stop(); 
    case "start": 
    start(); 
    break; 
} 

यह इतना है कि निष्पादन मामला दर मामला नीचे चलाता है डिज़ाइन किया गया है:

0

मैं वास्तव में नहीं देखता कि आप क्या चाहते हैं।

  1. यदि आप सभी मामलों में डिफ़ॉल्ट सामग्री को चलाने के लिए चाहते हैं, तो बस इसे स्विच के बाद रखें।
  2. यदि आप केवल "बनाए गए" मामले में और डिफ़ॉल्ट मामले में डिफ़ॉल्ट सामग्री को चलाने के लिए चाहते हैं, तो "बनाए गए" और "निर्माता" अनुभागों की स्थिति स्वैप करें और पहले के बाद ब्रेक डालें।
  3. यदि आप चाहते हैं कि कोड केवल निर्माता या बनाए गए मैचों में चलने के लिए चलाए, तो स्विच स्टेटमेंट से छुटकारा पाएं और if/else का उपयोग करें या झंडा का उपयोग करें और कथन का पालन करें।

सभी उपकरण देखते हैं।

+0

यह मेरे बारे में नहीं है, यह इस बारे में है कि एक स्विच स्टेटमेंट इस तरह क्यों काम कर रहा है। –

+0

मैं क्षमा चाहता हूं कि मैंने इस सवाल को गलत समझा। इतिहास जवाब है। प्रोग्रामिंग में सबसे ज्यादा कुछ की तरह, किसी ने ऐसा कहा। इस तरह उन्होंने कहा। वहां कुछ इतिहास है (मूल रूप से सी ने इसे शुरू किया), लेकिन यह वाक्यविन्यास है। – caveman

संबंधित मुद्दे