अगर () {} और अगर (): एंडिफ;


159

क्या कोई अंतर है ...

if ($value) {

}

...तथा...

if ($value):

endif;

?


दूसरा तरीका PHP4 के बाद से है, अगर पहले नहीं।
मील


1
अधिकांश उत्तर वास्तव में मुख्य बिंदु को संबोधित नहीं कर रहे हैं : जब आप कुछ कोड को देख रहे हैं तो बेहतर काम करता है और बहुत सारे क्लोजिंग कमांड हैं जैसे कि } } } }(जो कि साथ endifही किया जा सकता है ) और आप जानना चाहते हैं कि वे कहां खुले थे? इसका उत्तर न तो है । यह मूल रूप से अजगर डिजाइन सिद्धांतों का पहला "नियम" है
क्रैगॉक्स

7
स्पष्ट रूप {}से बेहतर है और : endif;एक अत्याचार है जो जीवन के निष्पक्ष होने पर अस्तित्व में नहीं होगा। एक अच्छे टेक्स्ट एडिटर के साथ आपको ब्रैकेट्स के मिलान के लिए एक कीबोर्ड शॉर्टकट होगा, जो आपको उद्घाटन से समापन या इसके विपरीत कूदने के लिए होगा। ऐसा कोई काम नहीं करता है और न ही कभी छिपे हुए : endif;सिंटैक्स के लिए मौजूद हो सकता है ।
developerwjk

3
@developerwjk ऐसा कैसे हो सकता है?
एलेक्स

जवाबों:


177

यदि आप अपने कोड में MVC हैं और अपने कोड में बहुत सारे इकोस नहीं चाहते हैं, तो वे समान हैं लेकिन दूसरा महान है। उदाहरण के लिए, मेरी .phtmlफ़ाइलों (Zend फ्रेमवर्क) में मैं कुछ इस तरह लिखूंगा:

<?php if($this->value): ?>
Hello
<?php elseif($this->asd): ?>
Your name is: <?= $this->name ?>
<?php else: ?>
You don't have a name.
<?php endif; ?>

38
@alex यह घुंघराले कोष्ठक के साथ भी काम करेगा, लेकिन कम से कम व्यक्तिगत रूप से मुझे इस तरह की चीजों में इस तरह की स्पष्टता मिलती है। क्योंकि वे जानते हैं कि यह एक का अंत है, न कि किसी प्रकार के लूप का अंत या कुछ और। सोचें कि आप अंतर्मुखी हैं और अंत में भी ऐसा ही है।
सविश

10
मैं <=?> का उपयोग नहीं करूंगा क्योंकि यह सभी सर्वरों पर समर्थित नहीं है, विशेष रूप से साझा किए गए होस्टिंग जो आपको php.ini को बदलने की अनुमति नहीं देते हैं।
सिक्की लिन

2
प्रासंगिक बिंदु <? Php एंडिफ है; ? - - आप वास्तव में बता सकते हैं कि HTML की कई लाइनों के साथ भी क्या खत्म हो रहा है पूर्ववर्ती अगर / और इस कथन को इनबेटवर्क।
फेंटन

7
क्यों "दूसरा बहुत अच्छा है यदि आप अपने कोड में बहुत सारे इकोस नहीं चाहते हैं"? मुझे लगता है कि यह पारंपरिक वाक्यविन्यास के लिए भी समान है {}। कोई अतिरिक्त गूंज की जरूरत नहीं है <?php if(...){ ?> ... <?php }else{ ?> ... <?php } ?>। क्या अंतर है <?php if(...): ?> ... <?php else: ?> ... <?php endif ?>?
Sithu

9
निश्चित नहीं है कि यह उत्तर उच्चतम क्यों है, क्योंकि यह एक महान उदाहरण नहीं है (आप घुंघराले ब्रेसिज़ के साथ सटीक प्राप्त कर सकते हैं)।
रीनियर केपर

69

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

मुझे एक भी संपादक के बारे में पता नहीं है जो एंडीफ़, एंडफोर्म इत्यादि को उजागर कर सकता है।


11
यह PHP के टेम्पलेट्स में उपयोग किया जाना चाहिए, जहां ब्लॉक की शुरुआत और अंत विदेशी भाषा के चंक द्वारा अलग किए जाते हैं। यदि आपका आईडीई PHP को पार्स करने के लिए अच्छी तरह से समझता है, तो इसे endifएंड-ऑफ-ब्लॉक को ठीक से हाइलाइट करना चाहिए । यदि ऐसा नहीं होता है, तो आप वास्तव में किसी भी चीज़ का उपयोग करके नहीं खरीदते हैं }क्योंकि यह वैसे भी मेल नहीं खाएगा।
पावेल मिनाएव

2
अधिकांश विचारधारा (कम से कम जिन लोगों का मैंने इस्तेमाल किया है) केवल {}
एंटोनियोकेसी

11
Netbeans 7.x खुशी से मेल खाते हुए एंडोर्फच, एंडिफ आदि को उजागर करता है
जोनाथन डे

@श्री। Minaev: ब्रेस मैचर 98% मामलों में सही ढंग से पार्स करेगा, यहां तक ​​कि इसके अंदर विदेशी कोड भी है। यह तभी फेल होगा जब इसके अंदर एक इज़ोटेरिक ब्रेस "कोडिंग नहीं बल्कि क्लोजिंग कोड" होगा। हां, ऐसा होता है, लेकिन ऐसा बहुत कम ही होता है। आप ऐसा क्यों सोचते हैं कि एक जटिल "अंत-जो भी हो;" पार्सर दृष्टिकोण सरल समाधान की तुलना में व्यावहारिक रूप से बेहतर करेगा?
पटलाडज

मुझे लगता है कि सबसे महत्वपूर्ण बिंदु वर्णनात्मक है , जब जरूरत होती है। इसलिए हम आसानी से यह जान सकते हैं कि यह कहां खुला था, फिर चाहे हमें किस उपकरण का उपयोग करना पड़े। PHP के लिए विशेष रूप से सच है, जो समय-समय पर आपको सबसे सरल संपादकों का उपयोग करके देखने की आवश्यकता है।
cregox

49

मुझे लगता है कि यह सब कहना है:

यह वैकल्पिक वाक्यविन्यास उन स्थितियों में जहां आप का मिश्रण है, उन परिस्थितियों में PHP (HTML और HTML दोनों के लिए) में सुधार के लिए उत्कृष्ट है।

http://ca3.php.net/manual/en/control-structures.alternative-syntax.php

HTML को PHP मिक्स करते समय वैकल्पिक sytnax पढ़ना बहुत आसान है। सामान्य PHP दस्तावेजों में पारंपरिक वाक्यविन्यास का उपयोग किया जाना चाहिए।


7
+1, इसका उद्देश्य क्या है, इस पर अच्छा जवाब। व्यक्तिगत रूप से मुझे लगता है कि यह एक पहले से बरबाद भाषा के लिए एक व्यर्थ जोड़ है।
ड्रेमन

29

हमारी कंपनी में, HTML से निपटने का पसंदीदा तरीका है:

<? if($condition) { ?>
   HTML content here
<? } else { ?>
   Other HTML content here
<? } ?>

अंत में, यह वास्तव में एक को चुनने और उसके साथ चिपके रहने का मामला है।


धन्यवाद - मैंने इस उत्तर को अपडेट किया। यह झाड़ी के चारों ओर थोड़ा धड़कता है, लेकिन इससे मदद मिल सकती है।
गहुआ

जब आप "हमारे" कहते हैं, तो आपका क्या मतलब है?
विचित्र

अत्यधिक इको स्टेटमेंट से बचने के लिए +1 और उद्धरण चिह्नों से बच गए। :)
जॉन मैकलम

त्रुटि:<?php if(TRUE){?> test <?php }?> <?php else{ ?> test2 <?php }?>
युषा अलाय्यूब

13

वे वास्तव में दोनों समान हैं, कार्यात्मक रूप से।

लेकिन अगर मैं endifसंवाददाता से बहुत दूर हो ifरहा हूं, तो मुझे लगता है कि यह एक संदर्भ टिप्पणी देने के लिए बहुत बेहतर अभ्यास है। बस आप आसानी से पा सकते हैं कि यह कहाँ खुला था। चाहे वह कोई भी भाषा हो:

if (my_horn_is_red or her_umbrella_is_yellow)
{

    // ...

    // let's pretend this is a lot of code in the middle

    foreach (day in week) {
        sing(a_different_song[day]);
    }

    // ...

} //if my_horn_is_red

यह वास्तव में किसी भी अनुरूप "समापन चीज" पर लागू होता है! ;)

इसके अलावा, सामान्य तौर पर, संपादक घुंघराले कोष्ठक के साथ बेहतर व्यवहार करते हैं, इस अर्थ में कि वे आपको इंगित कर सकते हैं कि यह कहाँ खुला था। लेकिन यहां तक ​​कि यह वर्णनात्मक टिप्पणियों को किसी भी कम वैध नहीं बनाता है।


1
सहमत यह बहुत बेहतर है - एंडिफ टाइप करने के बजाय - आप कह सकते हैं कि क्या स्थिति वास्तव में कर रही है।
कार्टालॉट

@ कार्टलॉट शायद भाषा में निर्मित (वैकल्पिक समापन नाम-ब्लॉक तर्क के रूप में) भी अच्छा होगा, इसलिए हम गलत स्थानों पर गलत ब्लॉक को बंद करने के लिए त्रुटियां हो सकते हैं! :)
cregox


9

मुझे लगता है कि यह विशेष रूप से स्पष्ट है जब आप स्क्रिप्ट्स को देखने में ifएस, forएस और foreachएस के मिश्रण का उपयोग कर रहे हैं:

<?php if ( $this->hasIterable ): ?>
    <h2>Iterable</h2>
    <ul>
    <?php foreach ( $this->iterable as $key => $val ):?>
        <?php for ( $i = 0; $i <= $val; $i++ ): ?>
        <li><?php echo $key ?></li>
        <?php endfor; ?>
    <?php endforeach; ?>
    </ul>
<?php elseif ( $this->hasScalar ): ?>
    <h2>Scalar</h2>
    <?php for ( $i = 0; $i <= $this->scalar; $i++ ): ?>
    <p>Foo = Bar</p>
    <?php endfor; ?>
<?php else: ?>
    <h2>Other</h2>
    <?php if ( $this->otherVal === true ): ?>
    <p>Spam</p>
    <?php else: ?>  
    <p>Eggs</p>  
    <?php endif; ?>
<?php endif; ?>

विरोध के रूप में:

<?php if ( $this->hasIterable ){ ?>
    <h2>Iterable</h2>
    <ul>
    <?php foreach ( $this->iterable as $key => $val ){?>
        <?php for ( $i = 0; $i <= $val; $i++ ){ ?>
        <li><?php echo $key ?></li>
        <?php } ?>
    <?php } ?>
    </ul>
<?php } elseif ( $this->hasScalar ){ ?>
    <h2>Scalar</h2>
    <?php for ( $i = 0; $i <= $this->scalar; $i++ ){ ?>
    <p>Foo = Bar</p>
    <?php } ?>
<?php } else { ?>
    <h2>Other</h2>
    <?php if ( $this->otherVal === true ){ ?>
    <p>Spam</p>
    <?php } else { ?>  
    <p>Eggs</p>  
    <?php } ?>
<?php } ?>

यह लंबे नियंत्रण बयानों के लिए विशेष रूप से उपयोगी है जहां आप नीचे के ब्रेस से शीर्ष घोषणा को देखने में सक्षम नहीं हो सकते हैं।


7

मुझे लगता है कि यह वास्तव में आपकी व्यक्तिगत कोडिंग शैली पर निर्भर करता है। यदि आप C ++, जावास्क्रिप्ट आदि के लिए उपयोग किए जाते हैं, तो आप {} सिंटैक्स का उपयोग करके अधिक सहज महसूस कर सकते हैं। यदि आप Visual Basic के लिए उपयोग किए जाते हैं, तो आप if: endif का उपयोग करना चाहते हैं; वाक्य - विन्यास।

मुझे यकीन नहीं है कि कोई निश्चित रूप से कह सकता है कि एक को दूसरे की तुलना में पढ़ना आसान है - यह व्यक्तिगत प्राथमिकता है। मैं आमतौर पर ऐसा कुछ करता हूं:

<?php
if ($foo) { ?>
   <p>Foo!</p><?php
} else { ?>
   <p>Bar!</p><?php
}  // if-else ($foo) ?>

क्या यह पढ़ने में आसान है:

<?php
if ($foo): ?>
   <p>Foo!</p><?php
else: ?>
   <p>Bar!</p><?php
endif; ?>

राय की बात है। मैं देख सकता हूं कि कुछ लोगों को ऐसा क्यों लगता है कि दूसरा तरीका आसान है - लेकिन केवल तभी जब आप जावास्क्रिप्ट और C ++ में अपने पूरे जीवन में प्रोग्रामिंग नहीं कर रहे हैं। :)


1
नहीं, कोष्ठक वस्तुनिष्ठ रूप से पढ़ना आसान है (जब मिस्र के संस्करण का उपयोग नहीं कर रहे हैं)। यहां तक ​​कि अगर आप कोष्ठक ऐसा कर रहे हैं कि वे मिस्र की तरह चलते हैं, तो VB सिंटैक्स की तुलना में पढ़ने में आसान है क्योंकि आधुनिक पाठ संपादकों के पास आपको ब्रैकेट खोलने के लिए एक कोष्ठक या आसपास के अन्य तरीके से ले जाने के लिए एक ब्रैकेट मिलान फ़ंक्शन होगा। वहाँ कोई रास्ता नहीं वे एक VB वाक्यविन्यास मिलान समारोह हो सकता है। इसके अलावा, आपके पास विचार करने के लिए घोंसले के शिकार हैं, और वीबी उस पर बुरी तरह से विफल रहता है।
developerwjk

5

मैं नए विकल्प की परवाह किए बिना यदि संभव हो तो पहले विकल्प का उपयोग करूंगा। वाक्यविन्यास मानक है और हर कोई इसे जानता है। यह भी पीछे संगत है।


5

दोनों एक ही हैं।

लेकिन: यदि आप अपनी दृश्य फ़ाइलों (अपनी MVC की वी) में अपनी टेम्प्लेटिंग भाषा के रूप में PHP का उपयोग करना चाहते हैं, तो आप व्यापार-तर्क (MVC के नियंत्रक और मॉडल भागों) और gui- को लागू करने के लिए लिखे गए php कोड के बीच अंतर करने के लिए इस वैकल्पिक वाक्यविन्यास का उपयोग कर सकते हैं। तर्क। बेशक, यह अनिवार्य नहीं है और आप जो भी वाक्यविन्यास पसंद करते हैं उसका उपयोग कर सकते हैं।

ZF उस दृष्टिकोण का उपयोग करता है।


5

दोनों सिंटैक्स के बीच कोई तकनीकी अंतर नहीं है। वैकल्पिक वाक्यविन्यास नया नहीं है; यह कम से कम PHP 4 के रूप में वापस समर्थित था, और शायद पहले भी।

आप वैकल्पिक रूप को पसंद कर सकते हैं क्योंकि यह स्पष्ट रूप से बताता है कि नियंत्रण संरचना समाप्त हो रही है: endwhileउदाहरण के लिए, केवल एक whileब्लॉक को समाप्त कर सकता है , जबकि यदि आप एक ब्रेस का सामना करते हैं, तो यह कुछ भी बंद हो सकता है।

आप पारंपरिक वाक्यविन्यास को पसंद कर सकते हैं, हालांकि, यदि आप किसी ऐसे संपादक का उपयोग करते हैं जिसे अन्य सी-जैसे सिंटैक्स में ब्रेसिज़ के लिए विशेष समर्थन है। उदाहरण के लिए, विम, ब्रेसिंग मेल करने के लिए और ब्रेस-सीमांकित ब्लॉक के शुरू और अंत में कई कीस्ट्रोक्स का समर्थन करता है। वैकल्पिक वाक्यविन्यास उस संपादक सुविधा को तोड़ देगा।


3

अंत में आप केवल निम्नलिखित पंक्ति की तलाश नहीं करना चाहते हैं और फिर यह अनुमान लगाना चाहते हैं कि यह कहाँ शुरू हुआ:

<?php } ?>

तकनीकी रूप से और कार्यात्मक रूप से वे समान हैं।


1
एक अच्छे टेक्स्ट एडिटर में एक ब्रैकेट मैचिंग शॉर्टकट होगा जो आपको उस स्थान पर ले जाएगा जहाँ से इसकी शुरुआत हुई थी। इसकी endif;शुरुआत मुश्किल है, क्योंकि वे इसके लिए एक समान कार्य नहीं करेंगे, और VB- शैली कोड अच्छी तरह से घोंसला नहीं बनाता है।
developerwjk

3

यह सब निर्भर करता है, व्यक्तिगत रूप से मैं इकोस और बहुत सारे इंडेंटेशन के साथ पारंपरिक वाक्यविन्यास को पसंद करता हूं, क्योंकि यह पढ़ना इतना आसान है।

<?php
    if($something){
        doThis();
    }else{
        echo '<h1>Title</h1>
            <p>This is a paragraph</p>
            <p>and another paragraph</p>';
    }
?>

मैं मानता हूं कि अलग-अलग सिंटैक्स अलग-अलग अंतिम खंडों के साथ क्लीनर है, लेकिन मेरे पास टेक्स्ट-एडिटर हाइलाइटिंग की मदद के बिना उनके साथ काम करने में मुश्किल समय है, और मैं इस तरह से "संघनित" कोड देखने के लिए अभ्यस्त नहीं हूं:

<?php if( $this->isEnabledViewSwitcher() ): ?>
<p class="view-mode">
    <?php $_modes = $this->getModes(); ?>
    <?php if($_modes && count($_modes)>1): ?>
    <label><?php echo $this->__('View as') ?>:</label>
    <?php foreach ($this->getModes() as $_code=>$_label): ?>
        <?php if($this->isModeActive($_code)): ?>
            <strong title="<?php echo $_label ?>" class="<?php echo strtolower($_code); ?>"><?php echo $_label ?></strong>&nbsp;
        <?php else: ?>
            <a href="<?php echo $this->getModeUrl($_code) ?>" title="<?php echo $_label ?>" class="<?php echo strtolower($_code); ?>"><?php echo $_label ?></a>&nbsp;
        <?php endif; ?>
    <?php endforeach; ?>
    <?php endif; ?>
</p>
<?php endif; ?>

2

मैं घुंघराले ब्रेसिज़ का उपयोग करता था, लेकिन अब एक दिन मैं कोड पठनीयता और पहुंच के कारण इस शॉर्ट-हैंड वैकल्पिक सिंटैक्स का उपयोग करना पसंद करता हूं।


मैं इसे अपने दृश्य टेम्पलेट्स में उपयोग करता हूं।
एलेक्स

2

व्यक्तिगत रूप से मैं इसे दो अलग-अलग वर्गों में बनाना पसंद करता हूं लेकिन समान PHP के भीतर:

<?php 
    if (question1) { $variable_1 = somehtml; }
    else { $variable_1 = someotherhtml; } 

    if (question2) {
        $variable_2 = somehtml2;
    }

    else { 
        $variable_2 = someotherhtml2;
    }         

etc.
$output=<<<HERE
htmlhtmlhtml$variable1htmlhtmlhtml$varianble2htmletcetcetc
HERE;
echo $output;

?>

लेकिन शायद यह धीमा है?


1

मुझे लगता है कि यह वरीयता की बात है। मैं व्यक्तिगत रूप से उपयोग करता हूं:

if($something){
       $execute_something;
}

1
यदि आप पूरा सूत्र पढ़ेंगे: वैकल्पिक वाक्यविन्यास पूर्वनिर्मित और बहुत <em> क्लीनर </ em> है जब php विचारों में विदेशी भाषा का प्रयोग या उपयोग कर रहे हैं
Juraj Blahunka

1

मैंने "यदि, और" शर्तों के लिए घुंघराले कोष्ठक का उपयोग किया। हालाँकि, मुझे "if (xxx): एंडीफ़;" अधिक अर्थपूर्ण है यदि कोड को भारी रूप से लपेटा गया है और किसी भी संपादकों में पढ़ना आसान है।

बेशक, बहुत से संपादक घुंघराले कोष्ठक के चयन के समय कोड को पहचानने और उजागर करने में सक्षम होते हैं। कुछ भी "अगर (xxx): एंडिफ" जोड़ी (जैसे, नेटबीन्स) पर अच्छा करते हैं

व्यक्तिगत रूप से, मैं "अगर (xxx): एंडिफ" की सिफारिश करूंगा, लेकिन छोटी स्थिति की जांच के लिए (जैसे, कोड की केवल एक पंक्ति), बहुत अंतर नहीं हैं।


1

मुझे लगता है कि कोई भी झाँकने वाले उत्तर यहाँ के उत्तर की पूरी तरह से पहचान नहीं करते हैं, इसलिए मैं अपने दृष्टिकोण को स्पष्ट करने जा रहा हूँ। कार्यात्मक रूप से, दो विधियाँ समान हैं। यदि प्रोग्रामर सी सिंटैक्स के बाद अन्य भाषाओं से परिचित है, तो वे ब्रेसिज़ के साथ अधिक सहज महसूस करेंगे, या फिर अगर php पहली भाषा है जो वे सीख रहे हैं, तो वे अधिक सहज महसूस करेंगेif endif सिंटैक्स के , क्योंकि यह करीब लगता है नियमित भाषा के लिए।

यदि आप वास्तव में गंभीर प्रोग्रामर हैं और चीजों को तेजी से प्राप्त करने की आवश्यकता है, तो मेरा मानना ​​है कि घुंघराले ब्रेस सिंटैक्स बेहतर है क्योंकि यह समय टाइप करने से बचाता है

if(/*condition*/){
    /*body*/ 
}

की तुलना में

if(/*condition*/):
    /*body*/
endif;

यह विशेष रूप से अन्य छोरों के साथ सच है, कहते हैं, foreachजहां आप एक अतिरिक्त 10 वर्णों को टाइप करेंगे। ब्रेसिज़ के साथ, आपको बस दो वर्ण लिखने की ज़रूरत है, लेकिन कीवर्ड आधारित सिंटैक्स के लिए आपको प्रत्येक लूप और सशर्त विवरण के लिए एक अतिरिक्त कीवर्ड लिखना होगा।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.