कोई करीबी टैग क्यों छोड़ देगा?


373

मैं यह पढ़ना जारी रखता हूं ?>कि फ़ाइल के अंत में PHP क्लोज टैग का उपयोग करने के लिए यह खराब अभ्यास है । शीर्ष लेख समस्या निम्न संदर्भ में अप्रासंगिक लगती है (और यह अब तक का एकमात्र अच्छा तर्क है):

PHP के आधुनिक संस्करणों ने php.ini में output_buffering झंडा सेट किया है। यदि आउटपुट बफ़रिंग सक्षम है, तो HTML को आउटपुट करने के बाद आप HTTP हेडर और कुकी सेट कर सकते हैं क्योंकि लौटा कोड तुरंत ब्राउज़र को नहीं भेजा जाता है।

हर अच्छी प्रैक्टिस बुक और विकी इस 'नियम' से शुरू होती है, लेकिन कोई भी अच्छे कारणों की पेशकश नहीं करता है। क्या अंत PHP टैग को छोड़ने का एक और अच्छा कारण है?


3
संभावित डुप्लिकेट [क्यों कुछ लिपियों में वे समापन php टैग को छोड़ देते हैं?>] ( stackoverflow.com/questions/3219383/… )
गॉर्डन

@ क्रिसियन - आपका मतलब है कि output_buffering का उपयोग करना आलसी है, या आलसी को छोड़ना है ?>?
एल योबो

4
@ गोर्डन - मुझे नहीं लगता कि यह एक ढकोसला है, ओपी अस्थिर कारणों को जानता है, बस यह जानना चाहता है कि क्या यह पूरी तरह से आउटपुट बफ़रिंग के साथ हल किया गया है।
एल योबो

5
एक बेहतर सवाल यह होगा कि कोई करीबी टैग क्यों शामिल करेगा? कोड बुराई है। सबसे अच्छा कोड कोई कोड नहीं है। यदि कोड के साथ हल करने के बजाय किसी समस्या को समाप्त किया जा सकता है, तो यह कोड होने से बेहतर है। इस मामले में, हल करने के लिए कोई समस्या नहीं है। कोड करीबी टैग के बिना ठीक काम करता है।
still_dreaming_1

19
हे भगवान, यह टैब के लिए जगह नहीं है बनाम रिक्त स्थान पवित्र युद्ध, योग्य :)
केविन व्हीलर

जवाबों:


321

सामान्य पाठ्यक्रम की तुलना में पहले हेडर भेजने के दूरगामी परिणाम हो सकते हैं। नीचे उनमें से कुछ ही हैं जो इस समय मेरे दिमाग में आए:

  1. जबकि वर्तमान PHP रिलीज़ में आउटपुट बफ़रिंग हो सकती है, वास्तविक उत्पादन सर्वर जिस पर आप अपना कोड तैनात करेंगे, किसी भी विकास या परीक्षण मशीनों की तुलना में कहीं अधिक महत्वपूर्ण है। और वे हमेशा नवीनतम PHP रुझानों का तुरंत पालन नहीं करते हैं।

  2. अकथनीय कार्यक्षमता हानि से आपको सिरदर्द हो सकता है । कहो, आप भुगतान प्रोसेसर द्वारा सफल पुष्टिकरण के बाद किसी विशिष्ट URL पर कुछ प्रकार के भुगतान गेटवे और पुनर्निर्देशित उपयोगकर्ता को लागू कर रहे हैं। यदि किसी प्रकार की PHP त्रुटि, यहां तक ​​कि एक चेतावनी, या एक अतिरिक्त लाइन समाप्त होती है, तो भुगतान असुरक्षित हो सकता है और उपयोगकर्ता अभी भी अटूट लग सकता है। यह भी एक कारण है कि अनावश्यक पुनर्निर्देशन बुराई है और यदि पुनर्निर्देशन का उपयोग किया जाना है, तो इसे सावधानी के साथ उपयोग किया जाना चाहिए।

  3. आप इंटरनेट एक्सप्लोरर में "पेज लोडिंग रद्द" प्रकार की त्रुटियां प्राप्त कर सकते हैं, यहां तक ​​कि सबसे हाल के संस्करणों में भी। इसका कारण यह है कि AJAX प्रतिक्रिया / json में कुछ ऐसी चीजें शामिल हैं, जो इसमें नहीं होनी चाहिए, क्योंकि कुछ PHP फ़ाइलों में अतिरिक्त लाइन समाप्त होने के कारण, जैसा कि मैंने कुछ दिनों पहले सामना किया है।

  4. यदि आपके ऐप में कुछ फ़ाइल डाउनलोड हैं , तो वे इस वजह से भी टूट सकते हैं। और आप इसे नोटिस नहीं कर सकते हैं, वर्षों के बाद भी, डाउनलोड की विशिष्ट ब्रेकिंग आदत सर्वर, ब्राउज़र, फ़ाइल के प्रकार और सामग्री पर निर्भर करती है (और संभवतः कुछ अन्य कारक जो मैं आपको बोर नहीं करना चाहता) ।

  5. अंत में, सिम्फनी , ज़ेंड और लारवेल सहित कई PHP फ्रेमवर्क ( कोडिंग दिशानिर्देशों में इसका कोई उल्लेख नहीं है लेकिन यह सूट का अनुसरण करता है) और PSR-2 मानक (आइटम 2.2) को समापन टैग की चूक की आवश्यकता होती है। PHP मैनुअल ( 1 , 2 ), Wordpress , Drupal और कई अन्य PHP सॉफ्टवेयर जो मुझे लगता है, ऐसा करने की सलाह देते हैं। यदि आप मानक (और अपने कोड के लिए PHP-CS-Fixer ) का अनुसरण करने की आदत बनाते हैं, तो आप समस्या को भूल सकते हैं। अन्यथा आपको हमेशा इस मुद्दे को अपने दिमाग में रखने की आवश्यकता होगी।

बोनस: इन 2 वर्णों से संबंधित कुछ गच (वास्तव में वर्तमान में एक):

  1. यहां तक ​​कि कुछ प्रसिद्ध पुस्तकालयों में बाद में अतिरिक्त लाइन अंत हो सकता है ?>। एक उदाहरण स्मार्टी है, यहां तक ​​कि दोनों के सबसे हाल के संस्करणों 2. * और 3. * शाखा में यह है। तो, हमेशा की तरह, तीसरे पक्ष के कोड के लिए देखें । बोनस में बोनस: अनावश्यक PHP अंत को हटाने के लिए एक regex: (\s*\?>\s*)$PHP कोड वाले सभी फ़ाइलों में खाली पाठ के साथ बदलें ।

थोड़ा अलग \?>(?s:.){0,10}\Z
रीजेक्स मैं नेटबिन

@ चेक, यह किसी भी टेक्स्ट-कोड को पकड़ता है- जो कि 10 अक्षर या उससे कम है ?>: जैसे कि यह मेल खाता है-और डिलीट- ?> Helloइन होगा <?php echo "test"; ?> Hello। हम केवल करीबी टैग साफ़ करना चाहते हैं।
हालिल Halzgür

6
इससे भी बदतर, PHP 5.4 के साथ अपाचे 2.4.6 वास्तव में हमारे उत्पादन मशीनों पर सेग दोष है जब समापन टैग के पीछे खाली जगह होती है। जब तक मैं अंत में बग को स्ट्रेस के साथ संकुचित नहीं कर देता, तब तक मैं घंटों बर्बाद करता हूं। यहाँ त्रुटि है कि अपाचे फेंकता है [core:notice] [pid 7842] AH00052: child pid 10218 exit signal Segmentation fault (11):।
आर्टेम रसाकोवस्की

3
@INTPnerd ओह, सवाल और अधिकांश जवाब हेडर चीज़ को संदर्भित करते हैं, इसलिए मैंने माना कि इस धागे को पढ़ने वाले किसी व्यक्ति को इसके बारे में पता होगा। अंतर्निहित समस्या और समस्याओं के वास्तविक कारणों में से कई के जवाब में यहाँ के बाद अनावश्यक व्हाट्सएप है ?>, जो (किसी भी आउटपुट की तरह) हेडर को आउटपुट होते ही भेज दिया जाता है। कोई "HTML हेडर" नहीं है (असंबंधित HTML5 <header>टैग के अलावा)।
हालील Halzgür

2
यह काम करना चाहिए, भले ही वैश्विक संशोधक: \ _ *?> \ S * \ Z अंत में '\ Z' को नोटिस करें। यह सुनिश्चित करता है कि आप php क्लोजिंग टैग को कैप्चर कर रहे हैं यदि और केवल अगर यह फ़ाइल के अंतिम छोर पर अंतिम नॉन-व्हाट्सएप है।
Erutan409

122

कारण आपको php क्लोजिंग टैग को छोड़ देना चाहिए ( ?>) ताकि प्रोग्रामर गलती से अतिरिक्त न्यूलाइन चार्ट न भेजें।

कारण यह है कि आप php बंद टैग को नहीं छोड़ना चाहिए क्योंकि यह php टैग में असंतुलन का कारण बनता है और आधे मन के साथ किसी भी प्रोग्रामर को अतिरिक्त सफेद-स्थान नहीं जोड़ने के लिए याद कर सकते हैं।

तो आपके प्रश्न के लिए:

क्या अंतिम php टैग को छोड़ने का एक और अच्छा कारण है?

नहीं, अंतिम php टैग को छोड़ने का एक और अच्छा कारण नहीं है ।

समापन टैग के साथ परेशान नहीं करने के लिए कुछ तर्क के साथ समाप्त करूंगा:

  1. लोग हमेशा गलती करने में सक्षम होते हैं, चाहे वे कितने भी स्मार्ट हों। एक अभ्यास का पालन करना जो संभावित गलतियों की संख्या को कम करता है (IMHO) एक अच्छा विचार है।

  2. PHP XML नहीं है। PHP को XML के कड़े मानकों को अच्छी तरह से लिखने और कार्यात्मक होने के लिए पालन करने की आवश्यकता नहीं है। यदि कोई लापता समापन टैग आपको परेशान करता है, तो आपको समापन टैग का उपयोग करने की अनुमति दी जाती है, यह एक तरह से या दूसरे तरीके से सेट-इन-स्टोन नियम नहीं है।


2
> आधे मन के साथ कोई भी प्रोग्रामर अतिरिक्त व्हाइट-स्पेस नहीं जोड़ने के लिए याद कर सकता है। इससे भी बेहतर, 1/2 के साथ कोई भी डेवलपर SVC में प्री-कमिट हुक जोड़ सकता है ताकि किसी भी अनुगामी रिक्त स्थान को स्वचालित रूप से हटा दिया जाए: कोई उपद्रव नहीं, कोई उपद्रव नहीं।
ब्रायनएच

6
@BryanH, जब तक आपके पास एक फ़ाइल होती है, जिसमें व्हाट्सएप को पीछे करना बिल्कुल आवश्यक होता है, लेकिन यह बहुत दुर्लभ है।
zzzzBov

1
आप सही कह रहे हैं, बिल्कुल। कुछ बहुत ही शांत विकल्पों के लिए mario के जवाब की जाँच करें ।
ब्रायनह

> "इसका कारण आपको php क्लोजिंग टैग नहीं छोड़ना चाहिए क्योंकि यह php टैग्स में असंतुलन का कारण बनता है और कोई भी प्रोग्रामर आधे मन से अतिरिक्त व्हाइट-स्पेस नहीं जोड़ने के लिए याद रख सकता है।" विंडोज पर, शायद। UNIX जैसी प्रणालियों पर, सभी फाइलें \ n के साथ समाप्त होती हैं और प्रोग्राम आपके लिए इसे जोड़ते हैं। संपादित करें: अहा! जैसा कि @mario द्वारा नीचे उल्लेख किया गया है, PHP वास्तव में खाती है।
एंड्रिया

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

57

यह एक नौसिखिया कोडिंग शैली की सिफारिश है , अच्छी तरह से इरादा है, और मैनुअल द्वारा सलाह दी गई है

  • दूर रहते हुए ?>हालांकि अभी हल करती गईं आम के हेडर पहले ही कारणों भेजा (कच्चे उत्पादन, बीओएम आदि, नोटिस,) और उनके अनुवर्ती समस्याओं।

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

  • Stylistically कुछ डेवलपर्स देखने के लिए पसंद करते हैं <?phpऔर ?>SGML टैग / XML प्रसंस्करण निर्देश के रूप में, एक निकटवर्ती टोकन के संतुलन की स्थिरता का अर्थ है। (कौन सा btw, निर्भरता के लिए उपयोगी है-संयुग्मन वर्ग में अप्रभावी फ़ाइल-दर-फ़ाइल ऑटोट्रैकिंग को सम्मिलित करना शामिल है।)

  • कुछ हद तक अपूर्व उद्घाटन <?phpके रूप में PHPs विशेषता है कुटिया (और प्रति पूरी तरह से संभव binfmt_misc ,) इस तरह एक इसी बंद टैग के अतिरेक को मान्य।

  • क्लासिक PHP सिंटैक्स मार्गदर्शिकाओं को अनिवार्य ?>\nऔर हाल ही में (PSR-2) चूक पर सहमत होने के बीच एक स्पष्ट सलाह विसंगति है ।
    (रिकॉर्ड के लिए: Zend फ्रेमवर्क एक दूसरे पर पोस्ट करने से इसकी अंतर्निहित श्रेष्ठता नहीं होती है। यह एक गलत धारणा है कि विशेषज्ञों को अनिर्दिष्ट एपीआई के दर्शकों को लक्षित / लक्षित करने के लिए तैयार किया गया था)।

  • SCMs और आधुनिक IDE, बिल्‍कुल समाधान प्रदान करते हैं, जिसमें करीबी टैग की देखभाल होती है।

?>नज़दीकी टैग के किसी भी उपयोग को हतोत्साहित करने के लिए केवल बुनियादी PHP प्रसंस्करण व्यवहार और भाषा शब्दार्थों को समझाने में देरी करने से अनन्त मुद्दों से बचा जा सकता है। प्रतिभागियों में प्रवीणता भिन्नता के कारण सहयोगी सॉफ्टवेयर विकास के लिए यह अभी भी व्यावहारिक है

टैग विविधता बंद करें

  • नियमित रूप से ?> बंद टैग के रूप में भी जाना जाता है T_CLOSE_TAG, या इस प्रकार "पास टोकन"।

  • इसमें कुछ और अवतार शामिल हैं, क्योंकि PHP मैजिक न्यूलाइन खाने के लिए :

    ?>\n (यूनिक्स लाइनफीड)

    ?>\r (कैरिज वापसी, क्लासिक एमएसी)

    ?>\r\n (सीआर / एलएफ, डॉस / विन पर)

    NELहालांकि PHP यूनिकोड कॉम्बो लाइनब्रेक (U + 0085) का समर्थन नहीं करता है ।

    प्रारंभिक PHP संस्करणों में आईआईआरसी संकलन-इन्स-प्लेटफ़ॉर्मिंग-अज्ञेयवाद को कुछ हद तक सीमित किया >गया था (एफआई यहां तक ​​कि बस करीब मार्कर के रूप में इस्तेमाल किया गया था), जो क्लोज-टैग-परिहार की संभावित ऐतिहासिक उत्पत्ति है।

  • अक्सर अनदेखी, लेकिन जब तक PHP7 उन्हें निकालता है , नियमित रूप से <?phpउद्घाटन टोकन किया जा सकता है वैध शायद ही कभी इस्तेमाल के साथ रखा </script>के रूप में अजीब समापन टोकन

  • " हार्ड क्लोज़ टैग " एक भी नहीं है - बस उस शब्द को सादृश्य के लिए बनाया गया है। वैचारिक और उपयोग-वार __halt_compilerको हालांकि करीब टोकन के रूप में मान्यता दी जानी चाहिए।

    __HALT_COMPILER();
    ?>

    जिसके बाद मूल रूप से एक टोकन कोड उसके बाद किसी भी कोड या सादे HTML खंड को छोड़ देता है। विशेष रूप से PHAR स्टब्स का उपयोग, या इसके निरर्थक संयोजन के ?>रूप में दर्शाया गया है।

  • इसी तरह स्क्रिप्ट्स को शामिल करने में एक शून्य काreturn; विकल्प होता है, जिसमें किसी भी तरह ?>के व्हाट्सएप को किसी भी तरह से प्रस्तुत करना शामिल है।

  • फिर सभी प्रकार के सॉफ्ट / फॉक्स क्लोज टैग विविधताएं हैं; कम ज्ञात और शायद ही कभी इस्तेमाल किया जाता है, लेकिन आमतौर पर प्रति टिप्पणी-आउट टोकन:

    • // ? >PHP टोकन टोकन द्वारा पता लगाने से बचने के लिए सरल रिक्ति ।

    • या फैंसी यूनिकोड विकल्प // ﹖﹥(U + FE56 SMALL QUESTION MARK, U + FE65 SMALL ANGLE BRACKET) जिसे एक रेगीक्स पकड़ सकता है।

    दोनों का मतलब PHP से कुछ भी नहीं है , लेकिन PHP-अनजान या अर्ध-जागरूक बाहरी टूलकिट के लिए व्यावहारिक उपयोग हो सकते हैं। फिर से catलिखी गई स्क्रिप्टों का परिणाम मन में आता है, जिसके परिणामस्वरूप // ? > <?phpपूर्व फ़ाइल सेक्शनिंग को इनलाइन-बनाए रखना होता है।

तो वहाँ एक समीपवर्ती बंद टैग छूट के संदर्भ-निर्भर लेकिन व्यावहारिक विकल्प हैं।

?>नज़दीकी टैगों का मैनुअल बच्चा सम्भालना किसी भी तरह से बहुत समकालीन नहीं है। उसके लिए हमेशा स्वचालन उपकरण होते हैं (भले ही बस sed / awk या regex-oneliners)। विशेष रूप से:

phptags टैग tidier

https://fossil.include-once.org/phptags/

जिसका उपयोग आम तौर पर --uncloseथर्ड-पार्टी कोड के लिए php टैग के लिए किया जा सकता है , या केवल किसी भी (और सभी) वास्तविक व्हाट्सएप / बीओएम मुद्दों को ठीक करने के लिए इस्तेमाल किया जा सकता है :

  • phptags --warn --whitespace *.php

यह --longरनटाइम / कॉन्फ़िगरेशन संगतता के लिए टैग रूपांतरण आदि को भी संभालता है ।


7
हाँ, कुंद और उत्तेजक फंतासी नीचे को आकर्षित करती है। समय के साथ मैंने जो कुछ पढ़ा है, उसमें से टोकन को छोड़ना तब तक बिल्कुल डाउनसाइड नहीं है जब तक आप सॉफ्टवेयर के साथ काम नहीं करते हैं जो इसे संभाल नहीं सकते हैं। जब तक आप वास्तव में यह साबित नहीं कर सकते कि बंद करने वाले टोकन खराब हैं और मेरे लिए एक बहुत ही
नीच

2
@Pichan: मैं इसकी अनुमति दूंगा। लेकिन मुझे लगता है कि आप यहाँ क्या कहा जा रहा है काफी समझ में नहीं आया है। बचना और बचना दो अलग चीजें हैं। और आधी समस्याएँ सांप के तेल की सलाह का परिणाम हैं।
17

6
@mario: यह एक नौसिखिया कोडिंग शैली की सिफारिश है । मैं असहमत हूं। संपूर्ण Zend फ्रेमवर्क बंद टैग को छोड़ देता है। मुझे लगता है कि यह एक बहुत ही व्यक्तिगत पसंद है, मैं वास्तव में अपने को छोड़ना पसंद करता हूं <? Php खोला गया और मुझे एक नौसिखिया नहीं लगता :)
Daniele Vrut

1
HTML के बारे में क्या? क्या इसकी जरूरत है? परीक्षा के लिए <?php if($var): ?>Hello World<?php endif; ?>??? मैं वास्तव में उत्सुक हूँ क्योंकि यह विशेष रूप से उल्लेख नहीं किया गया है।
WASasquatch 6

1
@WASasquatch हां। यदि आप HTML और PHP मोड के बीच स्विच कर रहे हैं, तो आपको किसी भी स्थिति में करीब टोकन की आवश्यकता होगी। (यहाँ मूल प्रश्न के लिए वास्तव में प्रासंगिक नहीं है।)
mario

22

यह एक टैग नहीं है ...

लेकिन अगर आपके पास यह है, तो आपको इसके बाद सफेद जगह होने का खतरा है।

यदि आप किसी दस्तावेज़ के शीर्ष पर शामिल के रूप में इसका उपयोग करते हैं, तो आप HTTP हेडर भेजने की कोशिश करने से पहले सफेद स्थान (यानी सामग्री) सम्मिलित कर सकते हैं ... जिसकी अनुमति नहीं है।


10
यदि यह एक टैग नहीं है तो क्या है?
दानीदाकर

क्या आप एक उदाहरण प्रदान कर सकते हैं? हो सकता है कि मेरा php कॉन्फिगर अजीब हो, लेकिन मैं इस समस्या को पुन: उत्पन्न नहीं कर सकता।
दानीदाकर

2
file1.php: <?php $i = 1; ?> उसके बाद file2.php:<?php include 'file1.php'; header('Location: http://www.google.com');?>
Quentin

1
आउटपुट बफरिंग के साथ-साथ डाउनसाइड भी होते हैं; यह सर्वर पर अधिक मेमोरी का उपयोग करता है (जैसा कि आउटपुट में सभी आउटपुट रैम में संग्रहीत किया जाना है, बिना बफरिंग के यह बस सीधे चला जाता है)। यह भी कभी इतना धीमा है। ज्यादातर मामलों में इनमें से कोई भी मुद्दा नहीं होगा, लेकिन मैं वैसे भी आलसी हूं, इसलिए केवल बंद टैग को छोड़ना क्यों नहीं है? मैं phpcsयह सुनिश्चित करने के लिए उपयोग करता हूं कि समापन टैग मेरी हर एक फ़ाइल में से एक है और फिर मुझे आउटपुट बफ़रिंग के बारे में चिंता नहीं है :)
El Yobo

1
@danip: यदि आपने php कॉन्फ़िगरेशन फ़ाइल में output_buffer ध्वज सेट किया है, तो आप इस समस्या को पुन: उत्पन्न नहीं कर सकते।
जिचाओ

16

यह बहुत उपयोगी है कि समापन को ?>अंदर न आने दें ।

फ़ाइल PHP (सिंटैक्स त्रुटि नहीं) के लिए मान्य है और जैसा कि @David Dorward ने कहा कि यह सफेद स्पेस / ब्रेक-लाइन (ब्राउज़र के लिए हेडर भेजने वाली कोई भी चीज़) होने से बचने की अनुमति देता है ?>

उदाहरण के लिए,

<?
    header("Content-type: image/png");
    $img = imagecreatetruecolor ( 10, 10);
    imagepng ( $img);
?>
[space here]
[break line here]

मान्य नहीं होगा।

परंतु

<?
    header("Content-type: image/png");
    $img = imagecreatetruecolor ( 10, 10 );
    imagepng ( $img );

मर्जी।

एक बार के लिए, आपको सुरक्षित होने के लिए आलसी होना चाहिए ।


3
इसलिए मैंने इटैलिक में सुरक्षित रखा है। यह आपको उन त्रुटियों से बचाता है जिनकी लागत आपको अवांछित स्थान के लिए बहुत समय लग सकती है ?>सुरक्षित यहाँ अच्छा शब्द नहीं हो सकता है। वैसे भी, यह कुछ भी ठीक नहीं करता है (यह चीजों को रोकने के लिए मेरे लिए बुरा कोड नहीं है, echoयहां एक बुरा कोड होगा) लेकिन / और यह अभी भी वैध है। इस पर मुझे गलत साबित करो।
शिखिर्यु

मैंने आपको नहीं बताया, btw। लेकिन मेरी बात आपके अनुकूल है। यह कुछ भी तय नहीं करता है। मैंने कभी नहीं कहा कि यह मान्य नहीं है, इसलिए मुझे कुछ भी साबित करने की आवश्यकता नहीं है।
क्रिश्चियन

1
Chouchenos, मुझे यकीन है कि आप सुरक्षित के बजाय सुरक्षित मतलब था। IMHO के लिए एक नकारात्मक बहुत ज्यादा था। आपको वापस एक वर्ग में लाया गया। ;-) आप गलत बात नहीं कह रहे थे। यहां तक ​​कि PHP विकास दिशानिर्देश आपको ऐसा करने के लिए प्रोत्साहित करते हैं। उदाहरण के लिए, आउटपुट बफ़रिंग के बजाय टैग चूक पर भरोसा करना बेहतर है। बाद का प्रदर्शन बंद करने के लिए display_errors सेट करने जैसा होगा। शुद्ध धोखा। और एक अच्छा मौका है कि आपका ऐप पोर्टेबल नहीं होगा। मुझे वास्तव में लगता है कि, एक नियम के रूप में, आउटपुट बफ़रिंग पर बिल्कुल भरोसा नहीं करना बेहतर है।
मारसपिन

1
मैं ऐसे लोगों से सवाल नहीं करना चाहता जो ?>केवल php के अंत में फाइल करना पसंद करते हैं। लेकिन क्या आपको कभी रिक्त स्थान के कारण हुई कुछ त्रुटि को डीबग करने की आवश्यकता है? इसके अलावा सभी सर्वर एक ही तरह से कॉन्फ़िगर नहीं किए जाते हैं खासकर जब आप किसी अन्य होस्ट पर जाते हैं, तो यह पकड़ना कि त्रुटियों को बहुत समय लगता है। यदि आप चाहते हैं कि आप इसे ?>बस करें, यदि आप कुछ अनुगामी स्थान भी जोड़ते हैं और आपकी टीम को डिबग करने की आवश्यकता है जो कि git पर दोष देने के लिए तैयार हैं ^ ^
CoffeDeveloper

16

डॉक्स के अनुसार , क्लोजिंग टैग को छोड़ना बेहतर होगा यदि यह निम्न कारण से फाइल के अंत में है:

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

PHP मैनुअल> भाषा संदर्भ> बुनियादी वाक्यविन्यास> PHP टैग


10

खैर, मुझे इसका कारण पता है, लेकिन मैं इसे नहीं दिखा सकता:

केवल PHP कोड वाली फ़ाइलों के लिए, समापन टैग ( ?>) की अनुमति कभी नहीं होती है। यह PHP द्वारा आवश्यक नहीं है, और इसे छोड़ देना प्रतिक्रिया में सफेद स्थान को पीछे करने के आकस्मिक इंजेक्शन को रोकता है।

स्रोत: http://framework.zend.com/manual/en/coding-standard.php-file-formatting.html


23
उस टैग को "कभी अनुमति नहीं दी गई" शायद एक Zend कोडिंग मानक है, लेकिन यह PHP फ़ाइल स्वरूपण के लिए एक वाक्यविन्यास नियम नहीं है।
मैट हगिंस

9

वैसे, इसे देखने के दो तरीके हैं।

  1. PHP कोड XML प्रोसेसिंग निर्देशों के एक सेट से ज्यादा कुछ नहीं है , और इसलिए .phpएक्सटेंशन वाली कोई भी फाइल XML फ़ाइल से ज्यादा कुछ नहीं है, बस ऐसा होता है कि PHP कोड के लिए पार्स किया जाए।
  2. PHP सिर्फ इतना है कि XML प्रोसेसिंग इंस्ट्रक्शन फॉर्मेट को उसके ओपन और क्लोज टैग के लिए शेयर किया जाता है। उसके आधार पर, .phpएक्सटेंशन वाली फाइलें मान्य XML फाइलें हो सकती हैं, लेकिन उन्हें होने की आवश्यकता नहीं है।

यदि आप पहले मार्ग को मानते हैं, तो सभी PHP फ़ाइलों को समापन टैग की आवश्यकता होती है। उन्हें छोड़ने के लिए एक अमान्य XML फ़ाइल बनाई जाएगी। तब फिर से, एक उद्घाटन <?xml version="1.0" charset="latin-1" ?>घोषणा के बिना , आपके पास वैसे भी एक वैध XML फ़ाइल नहीं होगी ... इसलिए यह एक प्रमुख मुद्दा नहीं है ...

यदि आप दूसरे मार्ग पर विश्वास करते हैं, जो दो प्रकार की .phpफाइलों के लिए दरवाजा खोलता है :

  • फ़ाइलें जिनमें केवल कोड होता है (उदाहरण के लिए लाइब्रेरी फ़ाइलें)
  • ऐसी फाइलें जिनमें मूल XML है और कोड (उदाहरण के लिए टेम्पलेट फ़ाइलें)

उसके आधार पर, कोड-ओनली फाइल्स एक क्लोजिंग ?>टैग के बिना समाप्त होने के लिए ठीक हैं । लेकिन एक्सएमएल-कोड फाइलें एक समापन के बिना समाप्त करने के लिए ठीक नहीं हैं ?>क्योंकि यह एक्सएमएल को अमान्य कर देगा।

लेकिन मुझे पता है कि तुम क्या सोच रहे हो। आप सोच रहे हैं कि इससे क्या फर्क पड़ता है, आप कभी भी एक PHP फ़ाइल को सीधे रेंडर करने के लिए नहीं जा रहे हैं, इसलिए यदि यह वैध XML है तो कौन परवाह करता है। ठीक है, इससे कोई फर्क नहीं पड़ता कि आप एक खाका तैयार कर रहे हैं। यदि यह XML / HTML मान्य है, तो एक सामान्य ब्राउज़र बस PHP कोड प्रदर्शित नहीं करेगा (यह एक टिप्पणी की तरह माना जाता है)। तो आप भीतर PHP कोड चलाने की जरूरत के बिना टेम्पलेट बाहर नकली कर सकते हैं ...

मैं यह नहीं कह रहा हूं कि यह महत्वपूर्ण है। यह सिर्फ एक दृश्य है जिसे मैं अक्सर व्यक्त नहीं करता हूं, इसलिए इसे साझा करने के लिए इससे बेहतर जगह क्या हो सकती है ...

व्यक्तिगत रूप से, मैं लाइब्रेरी फ़ाइलों में टैग बंद नहीं करता, लेकिन टेम्पलेट फ़ाइलों में करता हूं ... मुझे लगता है कि यह एक व्यक्तिगत प्राथमिकता है (और कोडिंग दिशानिर्देश) कुछ भी कठिन से अधिक ...


1
यह पूरी तरह से झूठ है। PHP उन टैग्स का XML में अनुवाद नहीं करता है, और इस प्रकार कोई असंतुलन उत्पन्न नहीं हो रहा है।
द्राचीनकट्ज़

7
@ फेलिसिटस: मुझे लगता है कि आप उस हिस्से को याद करते हैं जो कहता है कि "मैं यह नहीं कह रहा हूं कि यह महत्वपूर्ण है। यह सिर्फ एक दृश्य है जिसे मैं बहुत बार व्यक्त नहीं करता हूं, इसलिए इसे साझा करने के लिए बेहतर जगह क्या है ..." यह PHP के बारे में नहीं है। XML में टैग का अनुवाद। यह तब होता है जब किसी फ़ाइल को एक्सएमएल संदर्भ (जैसे HTML, या संपादकों, आदि) में व्याख्या की जाती है ... लेकिन बिंदु चूक गया ...
ircmaxell

7

पहले से कही गई हर बात के अलावा, मैं एक और कारण से जा रहा हूं जो हमारे लिए डिबग करने के लिए बहुत बड़ा दर्द था।

पीएचपी 5.4 के साथ अपाचे 2.4.6 वास्तव में हमारे उत्पादन मशीनों पर विभाजन दोष है जब समापन phpटैग के पीछे खाली जगह है । जब तक मैं अंत में बग को स्ट्रेस के साथ संकुचित नहीं कर देता, तब तक मैं घंटों बर्बाद करता हूं ।

यहाँ त्रुटि है कि अपाचे फेंकता है:

[core:notice] [pid 7842] AH00052: child pid 10218 exit signal Segmentation fault (11)

6

"क्या एक और अच्छा कारण (हेडर समस्या के अलावा) है जो अंतिम php टैग को छोड़ सकता है?"

जब आप बाइनरी आउटपुट, CSV डेटा, या अन्य गैर-HTML आउटपुट जेनरेट करते हैं, तो आप अनजाने में एक्स्ट्रासियस व्हाइटस्पेस वर्णों का उत्पादन नहीं करना चाहते हैं ।


1
मेरे पास एक ग्राहक शिकायत है क्योंकि उनके XML पार्सर हमारे आउटपुट को मना कर रहे थे जब शुरुआत में एक अतिरिक्त रिक्त लाइन थी। इससे भी बदतर, यह केवल एक सर्वर पर सात में से एक अतिरिक्त लाइन के साथ एक अप्रमाणित कॉन्फ़िगरेशन फ़ाइल में समापन टैग के बाद हो रहा था।
०२

5

पेशेवरों

विपक्ष

निष्कर्ष

मैं कहूंगा कि टैग को छोड़ने के पक्ष में तर्क मजबूत दिखते हैं ( हेडर के साथ बड़े सिरदर्द से बचने में मदद करता है ) ( यह PHP / Zend "अनुशंसा" है)। मैं मानता हूं कि यह सबसे "सुंदर" समाधान नहीं है जो मैंने कभी वाक्यविन्यास की स्थिरता के संदर्भ में देखा है, लेकिन क्या बेहतर हो सकता है?


2

जैसा कि मेरे प्रश्न को इस एक के डुप्लिकेट के रूप में चिह्नित किया गया था, मुझे लगता है कि यह पोस्ट करना ठीक है कि कुछ कारणों से वांछित टैग नहीं छोड़ा ?>जा सकता है।

  • पूर्ण प्रसंस्करण निर्देशों के साथ सिंटैक्स ( <?php ... ?>) PHP स्रोत वैध एसजीएमएल दस्तावेज़ है, जिसे एसजीएमएल पार्सर के साथ समस्याओं के बिना पार्स और संसाधित किया जा सकता है। अतिरिक्त प्रतिबंधों के साथ यह वैध XML / XHTML भी हो सकता है।

कुछ भी आपको मान्य XML / HTML / SGML कोड लिखने से रोकता है। PHP प्रलेखन इसके बारे में पता है। अंश:

नोट: यह भी ध्यान दें कि यदि आप XML या XHTML के भीतर PHP को एम्बेड कर रहे हैं तो आपको मानकों के अनुरूप बने रहने के लिए <? Php?> टैग का उपयोग करना होगा।

बेशक PHP सिंटैक्स SGML / XML / HTML सख्त नहीं है और आप एक दस्तावेज बनाते हैं, जो SGML / XML / HTML नहीं है, ठीक उसी तरह जैसे आप HTML को XML HTML में बदल सकते हैं या नहीं।

  • कुछ बिंदु पर आप स्रोतों को संक्षिप्त करना चाह सकते हैं। यह उतना आसान नहीं होगा, जितना कि cat source1.php source2.phpयदि आप को बंद ?>टैग को छोड़ कर पेश की गई असंगति है ।

  • बिना ?>यह बताना मुश्किल है कि क्या दस्तावेज़ को PHP एस्केप मोड या PHP इग्नोर मोड में छोड़ दिया गया था (PI टैग <?phpखोला गया है या नहीं)। यदि आप लगातार अपने दस्तावेजों को PHP इग्नोर मोड में छोड़ देते हैं तो जीवन आसान है। यह ठीक तरह से तैयार किए गए HTML दस्तावेज़ों के साथ काम करने की तरह है जैसे कि अस्पष्ट, बुरी तरह से नेस्टेड टैग आदि के साथ दस्तावेज़।

  • ऐसा लगता है कि कुछ संपादकों जैसे कि ड्रीमविवर को पीआई के बाएं खुले [1] के साथ समस्या हो सकती है ।


0

यदि मैं प्रश्न को सही ढंग से समझता हूं, तो इसका आउटपुट बफरिंग के साथ करना है और इससे प्रभावित होने वाले टैग बंद / समाप्त हो सकते हैं। मुझे यकीन नहीं है कि यह पूरी तरह से वैध सवाल है। समस्या यह है कि आउटपुट बफर का मतलब यह नहीं है कि क्लाइंट को भेजने से पहले सभी सामग्री को मेमोरी में रखा जाता है। इसका मतलब है कि कुछ सामग्री है।

प्रोग्रामर जानबूझकर बफर, या आउटपुट बफर को फ्लश कर सकता है तो क्या PHP में आउटपुट बफर विकल्प वास्तव में बदलता है कि समापन टैग कोडिंग कैसे होता है? मैं तर्क दूंगा कि ऐसा नहीं है।

और शायद इसीलिए अधिकांश उत्तर व्यक्तिगत शैली और वाक्य रचना में वापस चले गए।


0

Php कोड के 2 संभावित उपयोग हैं:

  1. PHP कोड जैसे कि क्लास डेफिनिशन या फंक्शन डेफिनिशन
  2. एक टेम्पलेट भाषा के रूप में PHP का उपयोग करें (यानी विचारों में)

अगर 1. बंद टैग पूरी तरह से अप्रयुक्त है, तो भी मैं ऐसे मामले में सिर्फ 1 (एक) php खुला टैग और NO (शून्य) समापन टैग देखना चाहूंगा। यह एक अच्छा अभ्यास है क्योंकि यह कोड को स्वच्छ बनाता है और प्रस्तुति से अलग तर्क देता है। प्रस्तुति के मामले के लिए (2.) कुछ ने पाया कि सभी टैग (यहां तक ​​कि PHP- संसाधित वाले) को बंद करना स्वाभाविक है, जिससे भ्रम पैदा होता है, क्योंकि PHP में वास्तव में 2 अलग-अलग उपयोग मामले हैं, जिन्हें मिश्रित नहीं किया जाना चाहिए: तर्क / पथरी और प्रस्तुति

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