2008-08-21 16 views
5

मैंने अफवाहें सुना है कि PHP "गोटो" कमांड शुरू करने की योजना बना रहा है। यह क्या करना चाहिए?GOTO कमांड?

मैंने थोड़ा खोज करने की कोशिश की है, लेकिन कुछ भी बहुत ही वर्णनात्मक नहीं मिला है। मैं समझता हूं कि यह "GOTO 10" जैसा कमांड नहीं होगा ...

+1

और वास्तव में यह PHP5 में है। और यह क्या करता है, "बस सादा गोटो"। –

उत्तर

9

वे एक असली गोटो नहीं जोड़ रहे हैं, लेकिन स्थिर लेबल का उपयोग करने के लिए BREAK कीवर्ड का विस्तार कर रहे हैं। असल में, यह बयान के स्विच स्विच करने की क्षमता को बढ़ाएगा। यहाँ अवधारणा उदाहरण मैंने पाया है:

<?php 
for ($i = 0; $i < 9; $i++) { 
    if (true) { 
     break blah; 
    } 
    echo "not shown"; 
    blah: 
    echo "iteration $i\n"; 
} 
?> 
बेशक

, एक बार गोटो "अफवाह" बाहर गया था, वहाँ एक अतिरिक्त COMEFROM मजाक प्रचार करने के लिए कुछ बुरे लोग को रोकने के लिए कुछ नहीं था। अपने पैर की उंगलियों पर रहो।

यह भी देखें:

http://www.php.net/~derick/meeting-notes.html#adding-goto

+4

मुझे लगता है कि यह वास्तव में उलझन में है, क्योंकि अपने आप पर एक ब्रेक लूप के लिए बाहर निकल जाएगा, न कि केवल कथन। – DisgruntledGoat

3

अनुमोदित, मैं एक PHP प्रोग्रामर नहीं हूं, और मुझे नहीं पता कि जीओटी का PHP का सटीक कार्यान्वयन कैसा दिखता है, लेकिन यहां है गोटो की मेरी समझ:

गोटो किसी अन्य की तरह एक अधिक स्पष्ट प्रवाह नियंत्रण कथन है। मान लें कि आपके पास कुछ नेस्टेड लूप हैं और आपको केवल एक चीज़ ढूंढनी होगी। आप एक सशर्त कथन (या कई) डाल सकते हैं और जब शर्तों को ठीक से पूरा किया जाता है, तो आप सभी लूपों से बाहर निकलने के लिए एक GOTO कथन का उपयोग कर सकते हैं, (सशर्त बयान के साथ घोंसले के प्रत्येक स्तर पर 'ब्रेक' कथन रखने के बजाय । प्रत्येक के लिए और हाँ, मेरा मानना ​​है कि परंपरागत कार्यान्वयन नामित लेबल कि गोटो बयान नाम से पर जा सकेंगे है आप कुछ इस तरह कर सकते हैं:।

for(...) { 
    for (...) { 
     for (...) { 
     // some code 
     if (x) GOTO outside; 
     } 
    } 
} 
:outside 

यह एक सरल (और अधिक कुशल) कार्यान्वयन है गोटो स्टेटमेंट के बिना। समतुल्य होगा:

for(...) { 
    for (...) { 
     for (...) { 
      // some code 
      if (x) break; 
     } 
     if(x) break; 
    } 
    if(x) break; 
} 

दूसरे मामले में (जो सामान्य अभ्यास है) वहां थे ई सशर्त बयान, जो कि केवल एक होने से स्पष्ट रूप से धीमा है। इसलिए, अनुकूलन/सरलीकरण कारणों के लिए, आप कसकर घोंसले वाले लूप में गोटो स्टेटमेंट का उपयोग करना चाहेंगे।

+0

इस कारण से आपको GOTO की आवश्यकता नहीं है। उन लूपों को तोड़ने के लिए एक अधिक संरचित तरीके के लिए मेरा उत्तर देखें जो हमेशा काम करता है और शून्य अक्षमता पेश करता है। इस उद्देश्य के लिए गोटो सिर्फ गूंगा है। (आप पर प्रतिबिंब नहीं है।) –

0

यह looks जैसा कि वर्तमान में यह PHP 5.3 में है, लेकिन अभी तक पूरी तरह से प्रलेखित नहीं है। जो मैं कह सकता हूं उससे सी के साथ इसका गोटो सिंटैक्स साझा करता है, इसलिए इसे चुनना और उपयोग करना आसान होना चाहिए। बस डिजस्ट्रा के warning को याद रखें और केवल तभी उपयोग करें जब आवश्यक हो।

0

@ steveth45

अंगूठे का मेरा नियम है कि यदि आप कोड अधिक से अधिक 3 स्तरों नेस्ट है, तो आप कुछ गलत कर रहे हैं। डी

+0

मैं थोड़ा सहमत हूं लेकिन कई बार नेस्टेड लूप के कई स्तर अपरिहार्य में हैं और इन्हें उपहास नहीं किया जाना चाहिए। – Christian

0

steveth45 द्वारा दिए गए उदाहरण में आप के बजाय एक समारोह का उपयोग कर सकते हैं::

function findItem(...) { 
    for (...) { 
    for (...) { 
     for (...) { 
     if (x) { 
      return theItem; 
     } 
     } 
    } 
    } 
} 

// no need for label now 
theItem = findItem(a, b, c); 
5

मैं हमेशा चकित हूँ

तो फिर तुम कई तोड़ बयान या गोटो का उपयोग कर के बारे में चिंता करने की जरूरत नहीं PHP डिजाइनरों कितने अविश्वसनीय रूप से गूंगा है।लेबल कोड ब्लॉक और तोड़ बयान लेबल संदर्भित कर सकते हैं कि: gotos का उपयोग करने का उद्देश्य गुणा नेस्टेड छोरों वहाँ एक बेहतर तरीका है और अधिक कुशल से बाहर तोड़ने बनाने के लिए है, तो

a: for (...) { 
    b: for (...) { 
     c: for (...) { 
       ... 
       break a; 
      } 
     } 
    } 

अब है स्पष्ट है जो पाश/बाहर निकलने के लिए ब्लॉक, और बाहर निकलने के लिए संरचित है; आप इस तरह स्पेगेटी कोड नहीं प्राप्त कर सकते हैं जैसे आप वास्तविक गेटोस के साथ कर सकते हैं।

यह एक पुराना, पुराना, पुराना विचार है। अच्छे नियंत्रण प्रवाह प्रबंधन संरचनाओं को 70 के दशक से हल किया गया है, और इस पर साहित्य लिखे जाने के बाद से लंबा है। बोहम-जैकोपिनी प्रमेय ने दिखाया कि आप फंक्शन कॉल, अगर-फिर-और, और लूप के साथ कुछ भी कोड कर सकते हैं। अभ्यास में, गहरे घोंसले वाले ब्लॉक से बाहर निकलने के लिए, बोहम-जैकोपीनी शैली कोडिंग के लिए अतिरिक्त बूलियन झंडे की आवश्यकता होती है ("इस ध्वज को लूप से बाहर निकलने के लिए सेट करें") जो बेवकूफ कोडिंग बुद्धिमान और अक्षम था (आप ऐसा नहीं चाहते हैं अपने आंतरिक पाश में झंडे)। यदि-तो-फिर, विभिन्न loops (जबकि, के लिए) और ब्रेक-टू-लेबल वाले ब्लॉक, आप दक्षता में हानि के बिना किसी भी एल्गोरिदम को कोड कर सकते हैं। सी ने क्या किया है इसकी प्रतिलिपि बनाने के बजाय लोग साहित्य क्यों पढ़ते हैं? गरर।

+0

क्या यह _break-to-labeled-block_ चीज नहीं है जिसका आपने उल्लेख किया है कि इस नई PHP सुविधा के साथ क्या आगे रखा जा रहा है? अगर मैं गलत हूं तो मुझे क्षमा करें –

+0

कौन सी नई सुविधा? के लिए जाओ? गोटो आपको अपने कोड के कुछ यादृच्छिक भाग में रखे लेबल पर ले जाएगा। ब्रेक-टू-लेबल * केवल * ब्लॉक के बाहर ब्लॉक से बाहर निकलने की अनुमति देता है। –

+0

खैर मुझे लगता है कि आपके द्वारा वर्णित _break-to-label_ चीज़ ** ** ** ** php6 में पेश होने की अफवाह क्या है। यह गोटो को पुनर्जीवित नहीं कर रहा है। –