क्या PHP में <? = टैग का उपयोग करना बुरा है?


189

मैं <?= ?>हाल ही में इस PHP टैग में आया हूं और मैं इसका उपयोग करने के लिए अनिच्छुक हूं, लेकिन यह इतना कठिन है कि मैं इस पर आपका ध्यान रखना चाहता हूं। मुझे पता है <? ?>कि छोटे टैग का उपयोग करना बुरा है और <?php ?>इसके बजाय हमें पूर्ण टैग का उपयोग करना चाहिए , लेकिन इस बारे में क्या <?= ?>:?

यह कुछ टाइपिंग को बचाएगा और कोड पठनीयता, आईएमओ के लिए बेहतर होगा। तो इसके बजाय:

<input name="someVar" value="<?php echo $someVar; ?>">

मैं इसे इस तरह लिख सकता था, जो क्लीनर है:

<input name="someVar" value="<?= $someVar ?>">

क्या इस ऑपरेटर का उपयोग किया गया है?


11
इस तरह के सवाल के साथ समस्या यह है कि यह बहुत राय है। "तकनीकी रूप से" सही या गलत तरीका नहीं है। कुछ के लिए तर्क है, कुछ के खिलाफ, इसकी सभी पसंद है। तो अंत में आप पर निर्भर है।
मिसेनकल

किसी भी रूप में समापन टैग से बचें, यदि आप कर सकते हैं - यानी फ़ाइल में केवल php कोड (कोई HTML आदि) नहीं है। यदि आपके पास एक समापन टैग है, तो इसके बाद कोई भी वर्ण ब्राउज़र के लिए आउटपुट होगा (एक वेब ऐप के लिए) - जिसके परिणामस्वरूप समस्याओं का सामना करना मुश्किल हो सकता है। अधिक के लिए: stackoverflow.com/a/4453835/49560
dharm0us

गैर-राय से संबंधित: बाहर देखें क्योंकि echoXSS के लिए बहुत आसानी से होता है, और आपको संदर्भ-समर्पित गूंज विधि पर बेहतर भरोसा करना चाहिए (यानी: जेएस संदर्भ के लिए या इसके बजाय एक function html($x) { echo htmlentities($x,...); }और संयुक्त राष्ट्र html($someVar);का echo $someVarउपयोग echo json_encode($x);करना)। यह तब <?=टैग को एक बुरा अभ्यास बनाता है क्योंकि इसका मतलब है कि आपने HTML-चर को किसी अन्य स्थान पर चर दिया है, और इसलिए कि अन्य स्थान को जादुई रूप से पता होना चाहिए कि इस चर को HTML से बचना होगा क्योंकि यह HTML संदर्भ में गूँज रहा है।
एक्सनोस

जवाबों:


209

इतिहास

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

PHP के लघु टैग के साथ प्राथमिक मुद्दा यह है कि PHP एक टैग ( <?) का चयन करने में कामयाब रहा जो कि एक अन्य सिंटैक्स, XML द्वारा उपयोग किया गया था ।

सक्षम विकल्प के साथ, आप सिंटैक्स त्रुटियों को प्राप्त किए बिना xml घोषणा को कच्चे करने में सक्षम नहीं थे:

<?xml version="1.0" encoding="UTF-8" ?>

यह एक बड़ा मुद्दा है जब आप विचार करते हैं कि XML और पार्सिंग कितना सामान्य है।

किस बारे में <?=?

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

PHP 5.4 के साथ, हालांकि लघु गूंज टैग को फिर से short_open_tagविकल्प से अलग किया गया है। मैं इसे अपनी सुविधा के प्रत्यक्ष समर्थन के रूप में देखता हूं <?=, क्योंकि इसमें और इसके साथ मौलिक रूप से कुछ भी गलत नहीं है।

समस्या यह है कि आप इस बात की गारंटी नहीं दे सकते हैं कि <?=यदि आप ऐसे कोड लिखने की कोशिश कर रहे हैं जो PHP संस्करणों की एक विस्तृत श्रृंखला में काम कर सकते हैं।

ठीक है, तो अब जब कि यह सब खत्म हो गया है

क्या आपको उपयोग करना चाहिए <?=?

लघु इको टैग का उपयोग करना है या नहीं, इसके बारे में फ्लोचार्ट


70
मैं आपके तड़क-भड़क वाले चित्र से असहमत हूं। सही उत्तर 99.99% YES है क्योंकि अधिकांश उत्पादन वातावरण लघु टैग का उपयोग करने के लिए कॉन्फ़िगर किए गए हैं। यह मानते <?=हुए कि आपने इसे उड़ा दिया है और वे भविष्य में इसे हटाते हैं, आप इसे एक मिनट से भी कम समय में ठीक कर सकते हैं, चाहे कितनी भी हज़ारों फाइलें इसका उपयोग करें, आप बस एक परियोजना-व्यापी खोज और इसके लिए प्रतिस्थापित <?=करते हैं <?php echo । मेरा जवाब चिंता की बात नहीं है और सिर्फ इसका इस्तेमाल करते हैं , लाभ परिणाम बहुत अधिक हैं। <?=अब एक छोटे टैग के रूप में नहीं माना जाता है, रासमस लेरडॉर्फ ने खुद को बहुत प्रतिबद्ध बनाया है।
ड्यूकफैगमिंग

32
@dukeofgaming, आप लघु टैग का उपयोग करने के लिए कॉन्फ़िगर किए जा रहे उत्पादन वातावरण के बारे में अपना डेटा कहां प्राप्त कर रहे हैं? उन्हें अक्षम करना सबसे अधिक सुझाए गए कॉन्फ़िगरेशनों में से एक है, जिसके बारे में मैंने सुना है, जादू के उद्धरण को अक्षम करने के लिए दूसरा। यह भी एक शून्य वातावरण बनाने के लिए एक देव वातावरण है कि उत्पादन से अलग है।
zzzzBov

4
छोटे टैग डिफ़ॉल्ट रूप से 5.3 php.net/manual/en/ini.core.php#ini.short-open-tag तक सक्षम थे , अधिकांश होस्टिंग सेवाएँ जिन्हें मैं जानता हूँ कि यह बिना किसी समस्या के साथ समर्थित है और यह एक कारण था कोहना रूपरेखा इसे प्रोत्साहित करने के लिए उपयोग किया जाता है। <?=हमेशा चालू रहेगा ( stackoverflow.com/a/6064813/156257 ) और अधिकांश समय वे चालू रहते थे। आप अपने होस्ट के साथ जाँच करके मुझे गलत साबित कर सकते हैं यदि: वे अक्षम हैं और PHP <5.3 का उपयोग कर रहे हैं और यदि वे उपयोगकर्ताओं द्वारा या विशेष अनुरोध पर सेटिंग को ओवरराइड करने की अनुमति नहीं देते हैं; अगर सभी पिछले झूठ है, हर तरह से चिंता के बारे में <?=
1

6
आप चिंतित नहीं हैं कि <?=इसे हटा दिया जाएगा, और न ही मैं। अन्य लोग हो सकते हैं, और यदि वे हैं, तो उन्हें उपयोग करने की आवश्यकता नहीं है <?=। कुछ लोगों को कुछ भाषा सुविधाओं का उपयोग करने का तर्कहीन डर होता है ( जैसे php में बंद टैग छोड़ना )।
zzzzBov

8
यह ठीक है मेरी बात: चिंता करने की कोई जरूरत नहीं है । मैं बस रखूँगा "क्या आप चिंतित हैं?" --हाँ -> "आगे बढ़ो और उनका उपयोग करो, चिंता करने की कोई जरूरत नहीं है"। यह भी महसूस होता है कि आप अनुमान लगा रहे हैं कि बंद टैग को छोड़ना एक बुरा अभ्यास है, जो नहीं है।
ड्यूकफैगमिंग

28

मेरी PHP टोपी को बंद करना

मैं निश्चित रूप <?= $someVar ?>से अधिक क्रिया echo(केवल व्यक्तिगत प्राथमिकता) के उपयोग के पक्ष में हूं । केवल नकारात्मक पक्ष यह है AFAIK उपयोगकर्ताओं को, जो पूर्व 5.4.0 चल रहे हैं, जिसमें मामले के लिए है short_open_tagमें सक्षम होना चाहिए php.ini

अब यह कहते हुए कि, यदि आपका प्रोजेक्ट OS नहीं है, तो यह एक मूट पॉइंट है। यदि ऐसा है, तो मैं या तो इस तथ्य का दस्तावेजीकरण करूंगा कि short_open_tagसक्षम होना चाहिए, या दो समाधानों के अधिक पोर्टेबल का उपयोग करना चाहिए।


1
नाइटपिक: भले ही PHP 5.4 पर <?=अप्रभावित है short_open_tag, फिर <?भी है और यदि आपको शॉर्ट फॉर्म टैग का उपयोग करने की आदत है, तो यह भूलना काफी आसान है कि किस संस्करण पर समर्थित है।
यानि

7
@YannisRizos <?=टेम्पलेट-शैली के उपयोग के लिए "मैं अब एक वेरिएबल आउटपुट कर रहा हूं" के रूप में अंतर करना अच्छा है , और <?php"अब मैं बहुत सारे कोड चला रहा हूं"। मैं उपयोग करने के लिए कभी नहीं सुझाव देंगे <?, लेकिन दोनों कि <?=और <?phpठीक हैं।
इज़्काता

2
+1 क्योंकि रासमस लेरडोर्फ शॉर्टहैंड <? = टैग का समर्थन करता है। मैंने उसकी एक बातचीत (फिर जल्द ही जारी होने वाली) PHP 5.4 पर देखी। यही कारण है कि PHP 5.4.0 के बाद से? = टैग हमेशा उपलब्ध है। मैंने बहुत सारे कोड प्री PHP 5.4 देखे हैं कि <? = टैग का उपयोग MVC एप्लिकेशन के व्यू में किया जाता है लेकिन <-php ...?> का उपयोग नॉन-व्यू फ़ाइलों में किया जाता है।
प्रोग्रामर

@ जेसन वह नहीं है जो मैं कह रहा हूं। "रासमस एंडोर्स फ़ू" एक तर्क नहीं है, "रैसमस एंडो फ़ू फ़्यू फॉर दिस एंड दैट कॉज़" हालांकि है।
यानि

2
@Yannis Rizos " रासमस इस और उस कारण के लिए foo का समर्थन करता है" हालांकि है। टटलैज के लिए धन्यवाद, लेकिन मेरा तर्क तब से था जब रासमस लेरडॉर्फ ने इसका समर्थन किया, यह भाषा का निर्माता होने के नाते और अभी भी PHP के विकास पर प्रभाव डालता है, परिवर्तन करने के लिए किए गए थे <? = टैग हमेशा उपलब्ध है। यह मुझे अपनी मूल टिप्पणी में जोड़ा जाना चाहिए "इसलिए विचारों में <? = का उपयोग करने का अभ्यास शायद और भी व्यापक हो जाएगा।" डांग, मुझे अपनी टिप्पणियों को अब ... डॉट्स ...
प्रोग्रामर

21

आपको शॉर्ट फॉर्म टैग से बचने की कोशिश करनी चाहिए, चाहे वह हो <?या <?=

मुख्य तकनीकी कारण पोर्टेबिलिटी है, आप कभी भी सुनिश्चित नहीं हो सकते कि शॉर्ट फॉर्म टैग हर दिए गए सेटअप के लिए काम करेंगे, क्योंकि वे short_open_tagनिर्देश को देखते हुए बंद किए जा सकते हैं । लेकिन आप हमेशा पूरी तरह से निश्चित हो सकते हैं कि लंबे रूप हर जगह काम करेंगे।

यह कुछ टाइपिंग को बचाएगा और कोड पठनीयता, आईएमओ के लिए बेहतर होगा।

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

<input name="someVar" value="{someVar}">

आपके दोनों उदाहरणों से कहीं अधिक पठनीय है।

अंत में, यह ध्यान देने योग्य है कि संक्षिप्त रूप टैग प्रमुख PHP परियोजनाओं द्वारा स्पष्ट रूप से हतोत्साहित किए जाते हैं, उदाहरण के लिए PEAR और Zend फ्रेमवर्क


14
टेम्पलेट्स के लिए +1। -1 पोर्टेबिलिटी के लिए। इसकी एक सर्वर साइड भाषा है। एक सर्वर के लिए जिन चुनौतियों पर आपको ध्यान केंद्रित करने की आवश्यकता है, वे हैं, स्केलेबिलिटी और सुरक्षा जैसी चीजें। यह यकीन है कि यह ... (! बस मामले में) कई प्लेटफार्मों पर चल पाएंगे बनाने में गंभीर समय निवेश करने के लिए एक आश्चर्यजनक बुरा विचार किया जाएगा ...
riwalk

3
@ Stargazer712 Hm? केवल एक चीज आप करने की ज़रूरत मानक का उपयोग है <?phpऔर echoके बजाय <?और <?=आपको लगता है कि के रूप में गंभीर समय की गणना करते हैं? और क्या होता है जब आप अपनी परियोजना को एक सर्वर पर ले जाते हैं जहां किसी कारण से छोटे टैग अक्षम होते हैं?
यानि

13
@Yannis: उन कुछ पात्रों को बहुत ज्यादा नहीं लग सकता है, लेकिन IMO वे बहुत शोर में जोड़ते हैं।
केविन क्लाइन

8
मुझे लगता है कि यह उल्लेख किया जाना चाहिए कि PHP का मूल उद्देश्य एक टेम्पलेट भाषा होना था । PHP के शीर्ष पर एक और टेम्पलेट इंजन (अधिक ब्लोट) जोड़ना मेरे ट्यूना नाव को फ्लोट नहीं करता है। बस अच्छी प्रथाओं का पालन करें (कुछ अच्छे सुझाव यहां हैं stackoverflow.com/questions/62617/… ) जब HTML के साथ PHP कोडिंग PHP और आप जाने के लिए अच्छा कर रहे हैं।
प्रोग्रामर

2
@ यानिस रिज़ोस हाँ इसका उल्लेख किया जाना चाहिए क्योंकि PHP में नए लोग यह सोच सकते हैं कि वे अपने PHP प्रोजेक्ट में [व्हिज़बैंग] टेम्पलेट इंजन का उपयोग करने के लिए बाध्य हैं बिना शुद्ध PHP का उपयोग किए बिना। क्या मुझे केवल पर्ल में पाठ प्रसंस्करण करना चाहिए , शायद नहीं, लेकिन मुझे लगता है कि अब तक पर्ल पाठ प्रसंस्करण में बहुत अच्छा है - इसी तरह PHP और templating के साथ।
प्रोग्रामर

15

पीएचपी-प्रलेखन स्पष्ट रूप से कहता है कि आप कम गूंज टैग सुरक्षित रूप से उपयोग कर सकते हैं:

5.4.0 The tag <?= is always available regardless of the short_open_tag ini setting.

हालांकि यह PHP संस्करण 5.4 और अधिक से अधिक के लिए है, लेकिन हर किसी को कम से कम इस का उपयोग करना चाहिए। मैं उन्हें केवल अस्थायी उद्देश्यों के लिए पसंद करूंगा।


10

लघु टैग का उपयोग करने के कारण:

  • वे छोटे हैं।

लघु टैग का उपयोग नहीं करने के कारण :

  • वे एक और कॉन्फ़िगरेशन गोचर का परिचय देते हैं - जब आप सर्वर को एक पेशेवर संदर्भ में सबसे अधिक बार नियंत्रित करते हैं, यदि आप अपने कोड को आम जनता के लिए जारी करने की योजना बनाते हैं, तो शॉर्ट टैग उन लोगों के लिए अपरिवर्तनीय रूप से टूट सकते हैं जो इसे कहते हैं, साझा होस्टिंग ।
  • वे आपके आउटपुट में अन-सैनिटाइज़्ड स्ट्रिंग्स को आकस्मिक रूप से छोड़ने के लिए बहुत आसान बनाते हैं। यह डरावना है क्योंकि यह XSS भेद्यता का परिचय दे सकता है। जबकि लंबे टैग इसे रोकने के लिए सीधे कुछ नहीं करते हैं, वे प्रोग्रामर को संकेत देते हैं कि शायद वे जो कर रहे हैं वह सही बात नहीं है, और उन्हें एक टेम्पलेट सिस्टम का उपयोग करना शुरू करना चाहिए जो स्वचालित रूप से अभी उनके लिए HTML-एन्कोडिंग को संभालता है । लंबे टैग के साथ गतिशील तार आउटपुट दर्दनाक है, जो एक अच्छी (शिक्षाप्रद) चीज है।

यह IMO को स्वीकार करने का जवाब है, यहां तक ​​कि थोमो टेम्पलेट भी सब कुछ XSS को सुरक्षित नहीं बनाएंगे (स्क्रिप्ट के src विशेषता में उपयोगकर्ता डेटा हमेशा असुरक्षित रहेगा) और मुझे नहीं पता कि टेम्पलेट तंत्र उचित गूंज संदर्भ से अवगत है या नहीं; क्या होगा यदि PHP चर एक स्क्रिप्ट टैग सामग्री में समाप्त होता है? HTML में एम्बेड किए गए SVG में?
एक्सनोस

@Xenos स्पष्ट रूप से जो प्रश्न में टेम्पलेट प्रणाली पर निर्भर करता है, और कोई चांदी की गोली नहीं है; लेकिन उनमें से ज्यादातर बग सतह को कम करते हैं, और उन परिदृश्‍यों की संख्या जहां मैनुअल परिश्रम (सुरक्षा बग का सबसे महत्वपूर्ण स्रोत) की आवश्यकता होती है। "डायनामिक सामग्री को स्क्रिप्ट टैग में न डालें" का अनुसरण करना आसान है (और ऑडिट के लिए) "सुनिश्चित करें कि सभी डायनामिक सामग्री एचटीएमएल-एनकोडेड है"।
तदममर्स

4

मुझे लगता है कि <?=संस्करण एक अच्छा / स्वीकार्य अभ्यास है, बशर्ते कि आप इसे केवल चर के अंतिम आउटपुट के लिए उपयोग करें और किसी भी फ़ंक्शन-कॉल या टर्नरी-तर्क से बचें जो सीधे डेटा की प्रस्तुति से संबंधित नहीं हैं ।

यह निश्चित रूप से <? echo($x); ?>हर जगह की तुलना में बहुत बेहतर है ।

लंबे समय तक, आप इस तरह के रूप में templating इंजन में देखना चाहते हो सकता है चतुर


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

2

PHP 7.4 के रूप में, खेल का मैदान थोड़ा बदल जाता है:

<? ?> आधिकारिक तौर पर पदावनत कर दिया गया है और PHP 8.0 में हटा दिया जाएगा।

PHP RFC: डिप्रेक्ट PHP कम खुले टैग स्पष्ट रूप से बताता है कि <?= ?>अप्रभावित है। यह इंगित करेगा (मेरे अनुसार, RFC नहीं) कि इसका उपयोग हतोत्साहित नहीं है।


-3

सच कहूं, तो मुझे लगता है कि जो भी विधि हो (पुराने या नए फैशन) की गूंज कुछ ज्यादा ही पुरानी है, जबकि एमवीसी 33 साल पहले ही मना लेता है।

मैं कहूंगा कि हाँ, यह एक एक्सएमएल दस्तावेज़ के भीतर आने वाले सर्वर (php) डेटा को एनकैप्सुलेट करने और अपने ऐप्लिकेटर / क्लाइंट लेयर में प्रोसेस करने के लिए एक अच्छा अभ्यास है, इस प्रकार, इस तरह के टैग का उपयोग करने के विचार को भी आप सहेजते हैं।


1
दरअसल एमवीसी 33 साल मनाता है, यह पहली बार दिसंबर 1979 में इस पत्र में उल्लिखित किया गया था ।
यानि

हाँ, मैं अभी भी 2000 में हूँ, मेरी गलती :-)
sebas

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