PHP पार्स / सिंटैक्स त्रुटियां; और उन्हें कैसे हल करें


652

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

PHP पार्स त्रुटि: वाक्यविन्यास त्रुटि, अनपेक्षित '{' सूचकांक 20 में

अप्रत्याशित प्रतीक हमेशा वास्तविक अपराधी नहीं होता है। लेकिन लाइन नंबर जहां देखने के लिए शुरू करने के लिए एक मोटा विचार देता है।

हमेशा कोड के संदर्भ में देखें । वाक्यविन्यास की गलती अक्सर उल्लेखित या पिछली कोड लाइनों में छिप जाती है । मैनुअल से सिंटैक्स उदाहरणों के खिलाफ अपने कोड की तुलना करें।

जबकि हर मामला दूसरे से मेल नहीं खाता। फिर भी वाक्यविन्यास गलतियों को हल करने के लिए कुछ सामान्य कदम हैं । इस संदर्भ ने आम समस्याओं को संक्षेप में प्रस्तुत किया है:

बारीकी से संबंधित संदर्भ:

तथा:

जबकि स्टैक ओवरफ्लो भी रूकी कोडर्स का स्वागत कर रहा है, यह ज्यादातर पेशेवर प्रोग्रामिंग प्रश्नों पर लक्षित है।

  • हर किसी की कोडिंग गलतियों और संकीर्ण टाइपो का जवाब देना ज्यादातर ऑफ-टॉपिक माना जाता है।
  • तो कृपया सिंटैक्स फिक्सिंग अनुरोध पोस्ट करने से पहले, मूल चरणों का पालन करने के लिए समय निकालें।
  • यदि आपको अभी भी है, तो कृपया अपनी स्वयं की सुलझाने की पहल, तय किए गए प्रयास, और जो दिखता है या गलत हो सकता है, उस पर आपकी विचार प्रक्रिया को दिखाएं।

यदि आपका ब्राउज़र "SyntaxError: अवैध चरित्र" जैसे त्रुटि संदेश प्रदर्शित करता है, तो यह वास्तव में नहीं है-संबंधित, लेकिन ए - सिंटैक्स त्रुटि


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


1
यह उत्तर होने के लिए पर्याप्त डेटा नहीं है, लेकिन कोई parsekit_compile_string के साथ एक विश्लेषक लिख सकता है, और इस पर अधिक अनुकूल उत्तर दे सकता है। यदि आपके आईडीई में एकीकृत है, तो यह काफी जानकारीपूर्ण हो सकता है।
ओवेन बेर्स्फोर्ड

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

1
@ फ्रेड- ii- मुझे लगता है कि अधिकांश कारण T_IF / T_FOREACH / ...ब्लॉक के समान हैं । यद्यपि मैं IF / ELSE / ELSEIF प्रश्नों के लिए अधिक कस्टम सारांश संकलित करना चाहता था।
मारियो

1
@mario यह नहीं जानता कि यह कैसे वाक्यांश है, लेकिन क्या यह प्रश्नोत्तर शायद थोड़ा सा फिर से लिखना और अधिक संरचित होना चाहिए? (अस्थायी टिप्पणी)
रिजियर १२

2
तुम्हें पता है, काश मेरे पास यह सूची होती, जब मैं PHP साल पहले सीख रहा था। बहुत उपयोगी है, खासकर शुरुआती के लिए।
चिपस्टर

जवाबों:


291

वाक्यविन्यास त्रुटियां क्या हैं?

PHP C- शैली और अनिवार्य प्रोग्रामिंग भाषाओं से संबंधित है। इसमें कठोर व्याकरण नियम हैं, जो गलत प्रतीकों या पहचानकर्ताओं का सामना करते समय इससे उबर नहीं सकते हैं। यह आपके कोडिंग इरादों का अनुमान नहीं लगा सकता है।

फ़ंक्शन परिभाषा वाक्य रचना सार

सबसे महत्वपूर्ण टिप्स

कुछ बुनियादी सावधानियां हैं जिन्हें आप हमेशा अपना सकते हैं:

  • उचित कोड इंडेंटेशन का उपयोग करें , या किसी भी उदात्त कोडिंग शैली को अपनाएं। पठनीयता अनियमितताओं को रोकती है।

  • सिंटैक्स हाइलाइटिंग के साथ PHP के लिए एक आईडीई या संपादक का उपयोग करें । जो कोष्ठक / कोष्ठक संतुलन के साथ भी मदद करते हैं।

    उम्मीद: अर्धविराम

  • मैनुअल में भाषा संदर्भ और उदाहरण पढ़ें । दो बार, कुछ कुशल बनने के लिए।

पार्सर त्रुटियों की व्याख्या कैसे करें

एक विशिष्ट सिंटैक्स त्रुटि संदेश पढ़ता है:

पार्स त्रुटि: सिंटैक्स त्रुटि, अप्रत्याशित T_STRING , उम्मीद ' ;' में file.php पर लाइन 217

जो एक वाक्यविन्यास गलती के संभावित स्थान को सूचीबद्ध करता है । उल्लिखित फ़ाइल नाम और लाइन नंबर देखें

एक मॉनीकर जैसे कि यह T_STRINGसमझाता है कि पार्सर / टोकनर किस प्रतीक को अंतिम रूप से संसाधित नहीं कर सकता है। हालांकि यह वाक्यविन्यास गलती का कारण नहीं है।

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

वाक्यविन्यास त्रुटियों को हल करना

सिंटेक्स हिचकी को कम करने और ठीक करने के लिए कई दृष्टिकोण हैं।

  • उल्लिखित स्रोत फ़ाइल खोलें। उल्लिखित कोड लाइन को देखें

    • भगोड़े तार और गलत ऑपरेटरों के लिए, यह आमतौर पर आप अपराधी को ढूंढते हैं।

    • दाएं से बाएं रेखा पढ़ें और कल्पना करें कि प्रत्येक प्रतीक क्या करता है।

  • अधिक नियमित रूप से आपको पूर्ववर्ती लाइनों को भी देखने की जरूरत है ।

    • विशेष रूप से, लापता ;अर्धविराम पिछली पंक्ति के अंत / कथन पर गायब हैं। (कम से कम शैलीगत दृष्टिकोण से।)

    • यदि {कोड ब्लॉक }गलत तरीके से बंद या नेस्टेड हैं, तो आपको स्रोत कोड के आगे भी जांच करने की आवश्यकता हो सकती है। सरल बनाने के लिए उचित कोड इंडेंटेशन का उपयोग करें ।

  • वाक्यविन्यास रंगीकरण को देखो !

    • स्ट्रिंग्स और वैरिएबल और कॉन्स्टेंट सभी में अलग-अलग रंग होने चाहिए।

    • ऑपरेटरों +-*/.को भी अलग-अलग रंग देना चाहिए। और वे गलत संदर्भ में हो सकते हैं।

    • यदि आप देखते हैं कि स्ट्रिंग का रंगीकरण बहुत अधिक या बहुत छोटा है, तो आपको एक बंद "या गायब क्लोजर या 'स्ट्रिंग मार्कर मिल गया है।

    • एक-दूसरे के बगल में दो समान-रंगीन विराम चिह्न वाले अक्षर होने से भी परेशानी हो सकती है। आमतौर पर, ऑपरेटरों अकेला कर रहे हैं यह नहीं है ++, --या कोष्ठकों एक ऑपरेटर के बाद। अधिकांश संदर्भों में एक दूसरे का अनुसरण करने वाले दो तार / पहचानकर्ता गलत हैं।

  • व्हॉट्सएप आपका दोस्त हैकिसी भी कोडिंग शैली का पालन करें ।

  • अस्थायी रूप से लंबी लाइनों को तोड़ें।

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

    • जटिल ifबयानों को अलग या नेस्टेड ifस्थितियों में विभाजित करें ।

    • लम्बी गणित के फार्मूले या तर्क श्रृंखला के बजाय, कोड को सरल बनाने के लिए अस्थायी चर का उपयोग करें। (अधिक पठनीय = कम त्रुटियां।)

    • के बीच नई कड़ियाँ जोड़ें:

      1. कोड जिसे आप आसानी से सही पहचान सकते हैं,
      2. भागों के बारे में आप अनिश्चित हैं,
      3. और पार्सर ने जिन पंक्तियों के बारे में शिकायत की है।

      लंबे कोड ब्लॉक का विभाजन वास्तव में वाक्यविन्यास त्रुटियों की उत्पत्ति का पता लगाने में मदद करता है।

  • टिप्पणी कोड अपमानजनक है।

    • यदि आप समस्या स्रोत को अलग नहीं कर सकते हैं, तो कोड के ब्लॉक (और इस प्रकार अस्थायी रूप से हटा दें) पर टिप्पणी करना शुरू करें।

    • जैसे ही आपको पार्सिंग त्रुटि से छुटकारा मिला, आपको समस्या स्रोत मिल गया है। वहां अधिक बारीकी से देखें।

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

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

  • एक नवागंतुक के रूप में, कुछ भ्रमित सिंटैक्स निर्माणों से बचें।

    • टर्निरी ? :कंडीशन ऑपरेटर कोड को कॉम्पैक्ट कर सकता है और वास्तव में उपयोगी है। लेकिन यह सभी मामलों में पठनीयता में सहायता नहीं करता है। बिना बताए सादे ifबयानों को प्राथमिकता दें ।

    • PHP का वैकल्पिक सिंटैक्स ( if:/ elseif:/ endif;) टेम्प्लेट के लिए सामान्य है, लेकिन सामान्य {कोड }ब्लॉक की तुलना में यकीनन कम आसान है ।

  • सबसे अधिक प्रचलित नई नवागंतुक गलतियाँ हैं:

    • ;बयानों / पंक्तियों को समाप्त करने के लिए अर्धविरामों को याद करना ।

    • "या के लिए बेमेल स्ट्रिंग उद्धरण बेमेल 'उद्धरण।

    • भूले हुए ऑपरेटरों, विशेष रूप से स्ट्रिंग .संघनन के लिए।

    • असंतुलित (कोष्ठक )। उन्हें रिपोर्ट की गई पंक्ति में गिनें। क्या उनकी संख्या बराबर है?

  • मत भूलो कि एक वाक्यविन्यास समस्या को हल करना अगले को उजागर कर सकता है।

    • यदि आप एक समस्या को दूर कर देते हैं, लेकिन नीचे कुछ कोड में अन्य फसलें हैं, तो आप ज्यादातर सही रास्ते पर हैं।

    • यदि एक ही पंक्ति में एक नई वाक्यविन्यास त्रुटि फसलों को संपादित करने के बाद, तो आपका परिवर्तन संभवतया एक विफलता थी। (हालांकि हमेशा नहीं।)

  • यदि आप इसे ठीक नहीं कर सकते, तो पहले से काम कर रहे कोड का बैकअप पुनर्स्थापित करें।

    • एक सोर्स कोड वर्जनिंग सिस्टम अपनाएं। आप हमेशा diffटूटे और पिछले काम करने वाले संस्करण को देख सकते हैं। कौन सा वाक्यविन्यास समस्या है के रूप में ज्ञानवर्धक हो सकता है।
  • अदृश्य आवारा यूनिकोड वर्ण : कुछ मामलों में, आपको अपने स्रोत पर एक हेक्सिडिटर या विभिन्न संपादक / दर्शक का उपयोग करने की आवश्यकता होती है । कुछ समस्याओं को सिर्फ आपके कोड को देखने से नहीं पाया जा सकता है।

    • grep --color -P -n "\[\x80-\xFF\]" file.phpगैर-एएससीआईआई प्रतीकों को खोजने के लिए पहले उपाय के रूप में प्रयास करें ।

    • विशेष BOMs में, शून्य-चौड़ाई वाले स्थान, या गैर-ब्रेकिंग स्थान, और स्मार्ट उद्धरण नियमित रूप से स्रोत कोड में अपना रास्ता खोज सकते हैं।

  • इस बात का ख्याल रखें कि किस प्रकार के लाइनब्रीक फाइलों में सेव हैं।

    • PHP सिर्फ \nनईलाइनों का सम्मान करती है, न कि \rगाड़ी के रिटर्न की।

    • जो कभी-कभार MacOS उपयोगकर्ताओं के लिए एक मुद्दा है (यहाँ तक कि OS X पर गलत संपादकों के लिए भी)।

    • यह अक्सर एकल-लाइन //या #टिप्पणियों का उपयोग किए जाने पर केवल एक मुद्दे के रूप में सतहों पर होता है। बहुभाषी /*...*/टिप्पणियां शायद ही कभी पार्सर को परेशान करती हैं जब लाइनब्रेक को अनदेखा किया जाता है।

  • यदि आपकी सिंटैक्स त्रुटि वेब पर प्रसारित नहीं होती है: ऐसा होता है कि आपके मशीन पर सिंटैक्स त्रुटि है। लेकिन बहुत ही फ़ाइल को ऑनलाइन पोस्ट करना अब इसे प्रदर्शित नहीं करता है। जिसका मतलब केवल दो चीजों में से एक हो सकता है:

    • आप गलत फ़ाइल देख रहे हैं!

    • या आपके कोड में अदृश्य आवारा यूनिकोड (ऊपर देखें) था। आप आसानी से पता लगा सकते हैं: बस अपने कोड को वेब फॉर्म से वापस अपने टेक्स्ट एडिटर में कॉपी कर लें।

  • अपने PHP संस्करण की जाँच करें । प्रत्येक सर्वर पर सभी सिंटैक्स निर्माण उपलब्ध नहीं हैं।

    • php -v कमांड लाइन दुभाषिया के लिए

    • <?php phpinfo(); एक के लिए वेबसर्वर के माध्यम से आह्वान किया।


    वे जरूरी समान नहीं हैं। विशेष रूप से जब चौखटे के साथ काम करते हैं, तो आप उन्हें मेल खाएंगे।

  • फ़ंक्शन / विधियों, कक्षाओं या स्थिरांक के लिए पहचानकर्ता के रूप में PHP के आरक्षित खोजशब्दों का उपयोग न करें ।

  • परीक्षण और त्रुटि आपका अंतिम उपाय है।

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

आगे के गाइड:

मौत की सफेद स्क्रीन

यदि आपकी वेबसाइट अभी खाली है, तो आमतौर पर एक सिंटैक्स त्रुटि का कारण होता है। इसके साथ उनका प्रदर्शन सक्षम करें:

  • error_reporting = E_ALL
  • display_errors = 1

अपने php.iniआम तौर पर, या .htaccessmod_php के माध्यम से , या .user.iniFastCGI सेटअप के साथ भी ।

टूटी हुई स्क्रिप्ट के भीतर इसे सक्षम करना बहुत देर हो चुकी है क्योंकि PHP पहली पंक्ति की व्याख्या / रन भी नहीं कर सकता है। त्वरित वर्कअराउंड एक आवरण स्क्रिप्ट को तैयार कर रहा है, कहते हैं test.php:

<?php
   error_reporting(E_ALL);
   ini_set("display_errors", 1);
   include("./broken-script.php");

फिर इस आवरण लिपि तक पहुँच कर असफल कोड का आह्वान करें।

यह PHP के सक्षम करने error_logऔर अपने वेबसर्वरerror.log को देखने में मदद करता है जब कोई स्क्रिप्ट HTTP 500 प्रतिक्रियाओं के साथ क्रैश होती है।


error_reporting(E_ALL | E_STRICT);PHP के पुराने संस्करणों के लिए
जियो

2
कुछ आईडीई (जैसे नेटबीन) न केवल सिंटैक्स हाइलाइटिंग बल्कि कोड फॉर्मेटिंग का भी समर्थन करते हैं। यदि आपको अपने कोड को ठीक से प्रारूपित करने और आईडीई को समय-समय पर केवल मामले में सुधार करने के लिए कहने की आदत है, तो आप बेजोड़ ब्रेसिज़ जैसी समस्याओं को पकड़ सकते हैं।
जोसेप वाल्स

115

मुझे लगता है कि यह विषय पूरी तरह से अतिविशिष्ट / अतिविशिष्ट है। एक आईडीई का उपयोग करना किसी भी वाक्यविन्यास त्रुटियों से पूरी तरह से बचने का रास्ता है। मैं तो यहां तक ​​कहूंगा कि बिना आईडीई के काम करना एक तरह से अनप्रोफेशनल है। क्यों? क्योंकि आधुनिक IDE आपके प्रत्येक वर्ण के बाद आपके सिंटैक्स की जाँच करता है। जब आप कोड और आपकी पूरी लाइन लाल हो जाती है, और एक बड़ी चेतावनी सूचना आपको सटीक प्रकार और वाक्यविन्यास त्रुटि की सटीक स्थिति दिखाती है, तो दूसरे समाधान की खोज करने की बिल्कुल आवश्यकता नहीं है।

वाक्य रचना-जाँच IDE का उपयोग करने का अर्थ है:

आप (प्रभावी रूप से) सिंटैक्स त्रुटियों में फिर से कभी नहीं दौड़ेंगे, सिर्फ इसलिए कि आप उन्हें टाइप करते हुए सही देखते हैं। गंभीरता से।

सिंटैक्स चेक के साथ उत्कृष्ट आईडीई (ये सभी लिनक्स, विंडोज और मैक के लिए उपलब्ध हैं):

  1. NetBeans [मुक्त]
  2. PHPStorm [$ 199 USD]
  3. PHP प्लगइन के साथ ग्रहण [मुक्त]
  4. उदात्त [$ 80 USD] (मुख्य रूप से एक पाठ संपादक, लेकिन प्लगइन्स के साथ विस्तार योग्य, जैसे PHP सिंटैक्स पार्सर )

2
यह तो ज़ाहिर है। हालाँकि, यहाँ IDE से संबंधित, क्या आप थोड़ा विस्तार कर सकते हैं जहाँ वे अपनी वाक्यविन्यास सहायकता में भिन्न हैं? उदात्त ज्यादातर एक संपादक है, आईडीई नहीं; लेकिन फिर और अधिक सुंदर और तड़क; मुख्य रूप से सिर्फ सिंटैक्स हाइलाइंग करता है लेकिन ब्रैकेट मिलान पर भी सत्य है। यह आसानी से PH_STON के विपरीत T_CONSTANT_AND_ENCAPSED त्रुटियों का पता लगाता है; हालांकि, इनलाइन त्रुटियों के लिए अधिक स्क्वीजीली लाइनें हैं। NetBeans c सिंटैक्स संकेत PHP से भी अधिक गूढ़ हुआ करते थे (यहां तक ​​कि निर्माण की अनुमति देते हुए भी)। क्या आप पेशेवरों / विपक्षों पर अपना अनुभव साझा कर सकते हैं; आपका पसंदीदा ग्रहण / पीडीटी है या ..?
मारियो

@mario मुझे लगता है कि आप वास्तव में इस विषय में बहुत गहरे हैं, इसलिए मैं वास्तव में यहां कुछ भी गलत नहीं कहना चाहता, लेकिन सभी कोड I (और मेरी टीम के साथी, कोड रखने वाले, फ्रीलांस पार्टनर) ने कभी भी आईडीई में लिखा है कभी निष्पादित नहीं किया गया था एक वाक्यविन्यास त्रुटि के साथ। इसलिए मुझे लगता है कि कम से कम Netbeans / PHPStorm का सिंटैक्स चेक बेहद शक्तिशाली है। लेकिन शायद मैंने आपके सवाल को गलत बताया है। कुछ घंटों में ...;)
श्लिक

आपका जवाब पहले से ही हाजिर है। हमारे सवालों के 99% फिट होगा। हालाँकि, इस संदर्भ के लिए मैं एक व्यापार पर विचार करना चाहूंगा जिस पर IDE अधिक नौसिखिया-अनुकूल टूलटिप्स प्रदान करता है । यह शायद हमारे लिए मामूली है, यदि आप पर्याप्त रूप से पारंगत हैं, तो रंगीकरण और स्क्वीजीली लाइनें पर्याप्त हैं। लेकिन मैं मानता हूं कि शुरुआती लोगों के लिए मतभेद अधिक महत्वपूर्ण हो सकते हैं।
मारियो

कभी-कभी एक आईडीई एक संभव विकल्प नहीं है। उदाहरण के लिए, वर्डप्रेस थीम या प्लगइन का त्वरित संपादन करना। हां, मैं सभी कोड को एक IDE में कॉपी कर सकता हूं, लेकिन फिर मुझे इसे खोलना है, इसे वहां सब पेस्ट करना है, हेडर सेट करना है और यह सब उस समय बकवास को बर्बाद करना है, जब मैं सिर्फ एक त्वरित संपादन की उम्मीद कर रहा हूं। अब, यदि आप नई सुविधाएँ विकसित कर रहे हैं या खरोंच से शुरू कर रहे हैं, तो, हाँ, इसे एक IDE में करें। आप इसे शुरू करने के लिए अतिरिक्त समय के उस बिट लेने का अफसोस नहीं करेंगे।
1934286

मैं IDE को ट्रेलर के रूप में देखता हूं, न कि केवल एक टूलबॉक्स के रूप में। यह FIX नहीं हो सकता है, लेकिन यह आपको सिंटैक्स त्रुटियों को खोजने और रोकने में मदद कर सकता है। यहाँ कई उत्तर यह कहते हुए प्रतीत होते हैं कि यदि आप कोड को साफ रखते हैं तो आपके पास त्रुटि करने की संभावना कम होती है और हाजिर होना आसान होता है। ऑटो-इंडेंटेशन, कोड संकेत, परिवर्तनीय घटना, ऑटो-क्लोजिंग ब्रैकेट और ऑटो-फॉर्मेटिंग के साथ अच्छी तरह से मुझे एक दिन में कई टाइपो की बचत होती है और मुख्य लाभ यह है कि मैं एक का उपयोग क्यों करता हूं। यह इस प्रश्न (डिबगर, डेटाबेस कनेक्टर, uml आरेख आदि) के दायरे से परे बाकी सब की गिनती नहीं कर रहा है। आईडीई आपको समय बचाएगा और सिंटैक्स त्रुटियों से अधिक रोक देगा।
लुई लाउडोग ट्रॉटियर

58

अप्रत्याशित [

इन दिनों, अप्रत्याशित [सरणी ब्रैकेट आमतौर पर पुराने PHP संस्करणों पर देखा जाता है। लघु सारणी वाक्य-विन्यास उपलब्ध पीएचपी के बाद से है > = 5.4 । पुराने प्रतिष्ठान केवल समर्थन करते हैं array()

$php53 = array(1, 2, 3);
$php54 = [1, 2, 3];
         

सरणी फ़ंक्शन परिणाम dereferencing इसी तरह पुराने PHP संस्करणों के लिए उपलब्ध नहीं है:

$result = get_whatever()["key"];
                      

संदर्भ - इस त्रुटि का PHP में क्या अर्थ है? - "सिंटैक्स त्रुटि, अनपेक्षित \[" सबसे आम और व्यावहारिक वर्कअराउंड दिखाता है।

हालाँकि, आप अपने PHP इंस्टॉलेशन को अपग्रेड करने में हमेशा बेहतर होते हैं। साझा वेबहोस्टिंग योजनाओं के लिए, पहले अनुसंधान जैसे SetHandler php56-fcgiकि एक नए रनटाइम को सक्षम करने के लिए इस्तेमाल किया जा सकता है।

यह सभी देखें:

यदि आप वास्तव में पुराने + धीमे PHP संस्करणों के साथ चिपके हुए हैं तो BTW, प्रीप्रोसेसर और PHP 5.4 सिंटेक्स-कन्वर्टर्स भी हैं।

अप्रत्याशित[ सिंटैक्स त्रुटियों के अन्य कारण

यदि यह PHP संस्करण बेमेल नहीं है, तो यह अक्सर एक सादे टाइपो या नवागंतुक वाक्यविन्यास गलती है:

  • आप कक्षाओं में सरणी संपत्ति घोषणाओं / अभिव्यक्तियों का उपयोग नहीं कर सकते हैं , यहां तक ​​कि PHP 7 में भी नहीं।

    protected $var["x"] = "Nope";
                  
  • [घुंघराले ब्रेसिज़ {या कोष्ठक खोलने के साथ भ्रमित करना (एक सामान्य निरीक्षण है।

    foreach [$a as $b)
            

    या और भी:

    function foobar[$a, $b, $c] {
                   
  • या सरणियों के रूप में स्थिरांक स्थिरांक (PHP 5.6 से पहले) की कोशिश कर रहा है:

    $var = const[123];
           

    कम से कम PHP constएक निरंतर नाम के रूप में व्याख्या करता है ।

    यदि आप एक सरणी चर (जो यहाँ विशिष्ट कारण है) का उपयोग करने का मतलब है, तो अग्रणी $सर्जन जोड़ें - तो यह एक बन जाता है $varname

  • आप globalएक सहयोगी सरणी के सदस्य पर कीवर्ड का उपयोग करने का प्रयास कर रहे हैं । यह मान्य सिंटैक्स नहीं है:

    global $var['key'];


अप्रत्याशित ] समापन वर्ग ब्रैकेट

यह कुछ हद तक दुर्लभ है, लेकिन समाप्ति सरणी ]ब्रैकेट के साथ वाक्यविन्यास दुर्घटनाएं भी हैं ।

  • )कोष्ठक या }घुंघराले ब्रेस के साथ फिर से बेमेल आम हैं:

    function foobar($a, $b, $c] {
                              
  • या जहां एक नहीं है, वहां एक सरणी को समाप्त करने की कोशिश करना:

    $var = 2];

    जो अक्सर बहु-पंक्ति और नेस्टेड सरणी घोषणाओं में होता है।

    $array = [1,[2,3],4,[5,6[7,[8],[9,10]],11],12]],15];
                                                 

    यदि ऐसा है, तो किसी भी समयपूर्व ]सरणी को बंद करने के लिए ब्रैकेट मिलान के लिए अपनी आईडीई का उपयोग करें । इसे कम करने के लिए बहुत कम से कम रिक्ति और न्यूलाइन्स का उपयोग करें।


लिंक 'PHP 5.4 सिंटैक्स डाउन-कन्वर्टर्स' github.com/IonutBajescu/short-arrays-to-long-arrays ऊपर टूट गया है।
डेनियल रीक्स

46

अनपेक्षित T_VARIABLE

एक "अप्रत्याशित T_VARIABLE" का मतलब है कि एक शाब्दिक $variableनाम है, जो वर्तमान अभिव्यक्ति / बयान संरचना में फिट नहीं है।

उद्देश्यपूर्ण सार / अक्षम ऑपरेटर + $ चर आरेख

  1. सेमीकोलन गैरमौजूद

    यह आमतौर पर पिछली पंक्ति में एक लापता अर्धविराम इंगित करता है । एक कथन के बाद चर कार्य एक अच्छा संकेतक है जहां देखना है:

           
    func1()
    $var = 1 + 2;     # parse error in line +2
  2. स्ट्रिंग संगति

    एक बार होने वाली दुर्घटना में भूले हुए संचालक के साथ स्ट्रिंग सहमति होती है .:

                                   
    print "Here comes the value: "  $value;

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

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

  3. गुम अभिव्यक्ति संचालकों

    बेशक एक ही मुद्दा अन्य अभिव्यक्तियों में उत्पन्न हो सकता है, उदाहरण के लिए अंकगणितीय संचालन:

               
    print 4 + 7 $var;

    PHP यह अनुमान नहीं लगा सकती है कि चर को जोड़ा, घटाया या तुलना किया जाना चाहिए आदि।

  4. सूचियाँ

    सिंटैक्स सूचियों के लिए समान, सरणी आबादी में, जहां पार्सर भी ,उदाहरण के लिए अपेक्षित अल्पविराम इंगित करता है :

                                          
    $var = array("1" => $val, $val2, $val3 $val4);

    या फ़ंक्शंस पैरामीटर सूची:

                                    
    function myfunc($param1, $param2 $param3, $param4)

    समान रूप से आप इसे listया globalबयानों के साथ देखते हैं , या जब लूप ;में अर्धविराम की कमी होती है for

  5. वर्ग घोषणाएँ

    यह पार्सर त्रुटि कक्षा की घोषणाओं में भी होती है । आप केवल स्थैतिक स्थिरांक दे सकते हैं, न कि भाव। इस प्रकार पार्सर निर्दिष्ट डेटा के रूप में चर के बारे में शिकायत करता है:

    class xyz {      
        var $value = $_GET["input"];

    बेजोड़ }बंद घुंघराले ब्रेसिज़ यहाँ विशेष रूप से नेतृत्व कर सकते हैं। यदि कोई विधि बहुत जल्दी समाप्त हो जाती है (उचित इंडेंटेशन का उपयोग करें!), तो एक आवारा चर को आमतौर पर कक्षा में घोषित शरीर में गलत स्थान पर रखा जाता है।

  6. पहचानकर्ताओं के बाद चर

    आपके पास कभी भी एक चर नहीं हो सकता है जो सीधे पहचानकर्ता का अनुसरण करे :

                 
    $this->myFunc$VAR();

    Btw, यह एक सामान्य उदाहरण है जहां इरादा चर चर का उपयोग करना था । इस मामले में $this->{"myFunc$VAR"}();उदाहरण के लिए एक चर संपत्ति देखने के साथ ।

    ध्यान रखें कि वेरिएबल वैरिएबल का उपयोग अपवाद होना चाहिए। नवागंतुक अक्सर उन्हें बहुत लापरवाही से उपयोग करने की कोशिश करते हैं, तब भी जब सरणियां सरल और अधिक उपयुक्त होंगी।

  7. भाषा निर्माण के बाद गुम कोष्ठक

    जल्दबाजी में टाइपिंग भूल खोलने या बंद करने के लिए कोष्ठक को जन्म दे सकती ifहै और forऔर foreachबयान:

           
    foreach $array as $key) {

    समाधान: (स्टेटमेंट और वैरिएबल के बीच गुम ओपनिंग जोड़ें ।

                          
    if ($var = pdo_query($sql) {
         $result = 

    घुंघराले {ब्रेस कोड ब्लॉक नहीं खोलता है, बंद किए बिना ifसाथ अभिव्यक्ति )पहले समापन कोष्ठक।

  8. एल्स स्थितियों की उम्मीद नहीं करता है

         
    else ($var >= 0)

    समाधान: शर्तों को निकालें elseया उपयोग करें elseif

  9. बंद करने के लिए कोष्ठक चाहिए

         
    function() uses $var {}

    समाधान: चारों ओर कोष्ठक जोड़ें $var

  10. अदृश्य व्हाट्सएप

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

    <?php
                              
    $var = new PDO(...);

    यह फाइलों की शुरुआत में और कॉपी-और-पेस्ट किए गए कोड के लिए प्रचलित है। यदि आपके कोड में सिंटैक्स समस्या नहीं है, तो हेक्सिडिटर के साथ जांचें।

यह सभी देखें


32

अनपेक्षित T_CONSTANT_ENCAPSED_STRING
अप्रत्याशित T_ENCAPSED_AND_WHITESPACE

अनिर्दिष्ट नाम T_CONSTANT_ENCAPSED_STRINGऔर T_ENCAPSED_AND_WHITESPACEउद्धृत शाब्दिक अर्थ"string"

वे विभिन्न संदर्भों में उपयोग किए जाते हैं, लेकिन वाक्यविन्यास मुद्दा काफी समान है। T_ENCAPSED ... चेतावनी दोहरे उद्धृत स्ट्रिंग संदर्भ में होती है, जबकि T_CONSTANT ... तार अक्सर सादे PHP अभिव्यक्तियों या कथनों में भटक जाते हैं।

  1. गलत परिवर्तनशील प्रक्षेप

    और यह गलत PHP चर प्रक्षेप के लिए सबसे अधिक बार आता है:

                                   
    echo "Here comes a $wrong['array'] access";

    PHP के सन्दर्भ में सरणियाँ कुंजियों का उद्धरण करना आवश्यक है। लेकिन डबल उद्धृत स्ट्रिंग्स (या HEREDOCs) में यह एक गलती है। पार्सर निहित एकल उद्धृत के बारे में शिकायत करता है 'string', क्योंकि यह आमतौर पर एक शाब्दिक पहचानकर्ता / कुंजी की अपेक्षा करता है।

    अधिक सटीक रूप से यह सरणी संदर्भों के लिए दोहरे उद्धरण चिह्नों के भीतर PHP2-शैली सरल वाक्यविन्यास का उपयोग करने के लिए मान्य है :

    echo "This is only $valid[here] ...";

    नेस्टेड सरणियों या गहरी वस्तु संदर्भों के लिए जटिल घुंघराले स्ट्रिंग अभिव्यक्ति सिंटैक्स की आवश्यकता होती है :

    echo "Use {$array['as_usual']} with curly syntax.";

    यदि अनिश्चित है, तो यह आमतौर पर उपयोग करने के लिए सुरक्षित है। इसे अक्सर अधिक पठनीय माना जाता है। और बेहतर आईडीई वास्तव में उसके लिए अलग सिंटैक्स रंगीकरण का उपयोग करते हैं।

  2. गुमशुदगी का सिलसिला

    यदि एक स्ट्रिंग एक अभिव्यक्ति का अनुसरण करता है, लेकिन एक संगति या अन्य ऑपरेटर का अभाव है, तो आप देखेंगे स्ट्रिंग स्ट्रिंग के बारे में PHP शिकायत:

                           
    print "Hello " . WORLD  " !";

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

  3. भ्रामक स्ट्रिंग उद्धरण बाड़ों

    स्ट्रिंग सिनीम को सम्‍मिलित करते समय समान सिंटैक्स त्रुटि होती है । एकल 'या दोहरे "उद्धरण द्वारा शुरू किया गया एक स्ट्रिंग भी उसी के साथ समाप्त होता है।

                    
    print "<a href="' . $link . '">click here</a>";
          ⌞⎽⎽⎽⎽⎽⎽⎽⎽⌟⌞⎽⎽⎽⎽⎽⎽⎽⎽⎽⎽⎽⌟⌞⎽⎽⎽⎽⎽⎽⎽⎽⎽⎽⎽⎽⎽⎽⎽⌟

    वह उदाहरण दोहरे उद्धरण चिह्नों से शुरू हुआ। लेकिन HTML विशेषताओं के लिए डबल कोट्स भी किस्मत में थे। हालांकि, भीतर दिए गए अभिप्रेरण संचालक को एकल उद्धरणों में दूसरे स्ट्रिंग के हिस्से के रूप में व्याख्यायित किया गया।

    टिप : सिंगल और डबल उद्धृत स्ट्रिंग्स के लिए थोड़ा अलग रंगीकरण का उपयोग करने के लिए अपना संपादक / आईडीई सेट करें। (यह आवेदन तर्क के साथ पाठीय आउटपुट के लिए उदाहरण के लिए दोहरे उद्धरण चिह्नों को प्राथमिकता देने में भी मदद करता है, और एकल उद्धृत स्ट्रिंग जैसे-जैसे मानों के लिए।)

    यह एक अच्छा उदाहरण है जहां आपको पहले स्थान पर दोहरे उद्धरण चिह्नों से बाहर नहीं निकलना चाहिए। इसके बजाय केवल HTML एट्रिब्यूट उद्धरणों के लिए उचित \"पलायन का उपयोग करें:

    print "<a href=\"{$link}\">click here</a>";

    हालांकि यह सिंटैक्स भ्रम की स्थिति भी पैदा कर सकता है, सभी बेहतर आईडीई / संपादक फिर से बच गए उद्धरणों को अलग तरह से रंगकर मदद करते हैं।

  4. छूटी हुई बोली

    समान रूप से पार्सर त्रुटियों के लिए एक नुस्खा खोलने "/ 'उद्धरण भूल गए हैं:

                   
     make_url(login', 'open');

    यहाँ ', 'एक नंगेपन के बाद एक स्ट्रिंग शाब्दिक बन जाएगा, जब स्पष्ट रूप loginसे एक स्ट्रिंग पैरामीटर होने का मतलब था।

  5. सरणी सूची

    यदि आप ,किसी सरणी निर्माण खंड में अल्पविराम याद करते हैं , तो पार्सर को दो लगातार तार दिखाई देंगे:

    array(               
         "key" => "value"
         "next" => "....",
    );

    ध्यान दें कि अंतिम पंक्ति में हमेशा एक अतिरिक्त अल्पविराम हो सकता है, लेकिन बीच में एक को देखना अक्षम्य है। जिसे सिंटैक्स हाइलाइटिंग के बिना खोजना मुश्किल है।

  6. समारोह पैरामीटर सूची

    फ़ंक्शन कॉल के लिए एक ही बात :

                             
    myfunc(123, "text", "and"  "more")
  7. भगोड़ा तार

    एक सामान्य विविधता काफी आसानी से भुलाए गए स्ट्रिंग टर्मिनेटर हैं:

                                    
    mysql_evil("SELECT * FROM stuffs);
    print "'ok'";
          ⇑

    यहाँ PHP दो स्ट्रिंग शाब्दिक के बारे में सीधे एक दूसरे का अनुसरण करते हुए शिकायत करती है। लेकिन असली कारण पाठ्यक्रम के पहले से लागू नहीं है।

यह सभी देखें


27

अनपेक्षित T_STRING

T_STRINGएक मिथ्या नाम का एक सा है। इसमें एक उद्धृत का उल्लेख नहीं है "string"। इसका मतलब एक कच्चा पहचानकर्ता था। यह bareशब्दों से बचे हुए CONSTANTया फ़ंक्शन नाम, भुलाए गए बिना तार या किसी भी सादे पाठ तक हो सकता है।

  1. गुमराह तार

    हालांकि गलत स्ट्रिंग मानों के लिए यह सिंटैक्स त्रुटि सबसे आम है। कोई भी अज्ञात और आवारा "या 'उद्धरण एक अमान्य अभिव्यक्ति बनाएगा:

                                     
     echo "<a href="http://example.com">click here</a>";

    सिंटैक्स हाइलाइटिंग ऐसी गलतियों को सुपर स्पष्ट कर देगा। \"दोहरा उद्धरण, या \'एकल उद्धरण से बचने के लिए बैकस्लैश का उपयोग करना याद रखना महत्वपूर्ण है - इसके आधार पर स्ट्रिंग संलग्नक के रूप में उपयोग किया गया था ।

    • सुविधा के लिए आपको बाहरी सिंगल कोट्स को प्राथमिकता देनी चाहिए, जब सादे HTML को डबल कोट्स के साथ आउटपुट किया जाए।
    • यदि आप वैरिएबल को इंटरपोल करना चाहते हैं, तो दोहरे उद्धृत स्ट्रिंग्स का उपयोग करें, लेकिन फिर शाब्दिक "दोहरे उद्धरणों से बचने के लिए देखें ।
    • लम्बे आउटपुट के लिए, अंदर और बाहर भागने के बजाय कई echo/ printलाइनों को प्राथमिकता दें। बेहतर अभी तक एक HEREDOC अनुभाग पर विचार करें ।

    एक अन्य उदाहरण PHP के साथ उत्पन्न HTML कोड के अंदर PHP प्रविष्टि का उपयोग कर रहा है:

    $text = '<div>some text with <?php echo 'some php entry' ?></div>'

    ऐसा तब होता है जब $textकई लाइनों के साथ बड़ा होता है और डेवलपर पूरे PHP चर मान को नहीं देखता है और अपने स्रोत के बारे में भूलकर कोड के टुकड़े पर ध्यान केंद्रित करता है। उदाहरण यहाँ है

    यह भी देखें कि PHP में एकल-उद्धृत और दोहरे-उद्धृत स्ट्रिंग्स के बीच अंतर क्या है?

  2. बिना तार के

    यदि आप एक समापन याद करते हैं" तो एक सिंटैक्स त्रुटि आमतौर पर बाद में हो जाती है। एक अपरिवर्तित स्ट्रिंग अक्सर अगले इच्छित स्ट्रिंग मान तक कोड का एक सा उपभोग करेगा:

                                                           
    echo "Some text", $a_variable, "and some runaway string ;
    success("finished");
             ⇯

    यह सिर्फ शाब्दिक नहीं है, T_STRINGजो पार्सर तब विरोध कर सकता है। Unexpected '>'अनौपचारिक शाब्दिक HTML के लिए एक और लगातार भिन्नता है ।

  3. गैर-प्रोग्रामिंग स्ट्रिंग उद्धरण

    यदि आप किसी ब्लॉग या वेबसाइट से कोड कॉपी और पेस्ट करते हैं , तो आप कभी-कभी अमान्य कोड के साथ समाप्त होते हैं। PHP के अपेक्षा परिकल्पित उद्धरण नहीं हैं :

    $text = Something something..’ + these ain't quotes”;

    टाइपोग्राफिक / स्मार्ट उद्धरण यूनिकोड प्रतीक हैं। PHP उन्हें अक्षरांकीय पाठ से सटे हिस्से के रूप में मानता है। उदाहरण के लिए ”theseएक निरंतर पहचानकर्ता के रूप में व्याख्या की गई है। लेकिन किसी भी निम्नलिखित पाठ शाब्दिक को तब पार्सर द्वारा नंगे स्वरुप / T_STRING के रूप में देखा जाता है।

  4. लापता अर्धविराम; फिर

    यदि आपके पास पिछली पंक्तियों में एक असंबद्ध अभिव्यक्ति है, तो किसी भी निम्न कथन या भाषा निर्माण को कच्चे पहचानकर्ता के रूप में देखा जाता है:

           
    func1()
    function2();

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

  5. <?xmlPHP स्क्रिप्ट में छोटे खुले टैग और हेडर

    यह बल्कि असामान्य है। लेकिन यदि short_open_tags सक्षम हैं, तो आप XML घोषणा के साथ अपनी PHP स्क्रिप्ट शुरू नहीं कर सकते हैं :

          
    <?xml version="1.0"?>

    PHP <?स्वयं के लिए इसे देखेगा और पुनः प्राप्त करेगा। यह समझ में नहीं आएगा कि भटके हुए xmlका क्या मतलब था। इसे निरंतर के रूप में व्याख्यायित किया जाएगा। लेकिन versionवसीयत को दूसरे शाब्दिक / निरंतर के रूप में देखा जाएगा। और जब से पार्सर बीच में एक अभिव्यक्ति ऑपरेटर के बिना दो बाद के शाब्दिक / मूल्यों की समझ नहीं बना सकता है, तो यह एक पार्सर विफलता होगी।

  6. अदृश्य यूनिकोड वर्ण

    सिंटैक्स त्रुटियों के लिए एक सबसे छुपा कारण यूनिकोड प्रतीक हैं, जैसे कि गैर-ब्रेकिंग स्पेस । PHP यूनिकोड वर्णों को पहचानकर्ता नामों के रूप में अनुमति देता है। यदि आपको पूर्णतः अशुभ कोड के लिए T_STRING पार्सर शिकायत मिलती है जैसे:

    <?php
        print 123;

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

    आप इसे ;प्रत्येक पंक्ति प्रारंभ में निरर्थक विवरण विभाजकों को जोड़ने के साथ संकीर्ण कर सकते हैं :

    <?php
        ;print 123;

    यहां अतिरिक्त ;अर्धविराम पूर्ववर्ती अदृश्य चरित्र को अपरिभाषित स्थिर संदर्भ (कथन के रूप में अभिव्यक्ति) में परिवर्तित कर देगा। जो बदले में PHP को एक सहायक नोटिस का उत्पादन करता है।

  7. चर नामों के सामने `$` चिह्न गायब है

    PHP में चर चर के नाम के बाद एक डॉलर चिह्न द्वारा दर्शाए जाते हैं।

    डॉलर का चिह्न ( $) एक सर्जन है जो पहचानकर्ता को एक चर के नाम के रूप में चिह्नित करता है। इस सतर्कता के बिना, पहचानकर्ता भाषा कीवर्ड या स्थिर हो सकता है ।

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

  8. बच गए कोटेशन के निशान

    यदि आप \एक स्ट्रिंग में उपयोग करते हैं , तो इसका एक विशेष अर्थ है। इसे " एस्केप कैरेक्टर " कहा जाता है और सामान्य रूप से पार्सर को अगले चरित्र को शाब्दिक रूप से लेने के लिए कहता है।

    उदाहरण: echo 'Jim said \'Hello\'';छपेगाJim said 'hello'

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

    Windows में पथ निर्दिष्ट करते समय बहुत सामान्य त्रुटि: "C:\xampp\htdocs\"गलत है। आपको चाहिए "C:\\xampp\\htdocs\\"


18

अप्रत्याशित (

ओपनिंग कोष्ठक आमतौर पर if/ foreach/ for/ array/ listया एक अंकगणितीय अभिव्यक्ति शुरू करने के रूप में भाषा निर्माण का पालन करते हैं । वे "strings"पिछले (), एक अकेला $, और कुछ विशिष्ट घोषणा संदर्भों के बाद वाक्यात्मक रूप से गलत हैं ।

  1. फंक्शन घोषणा पैरामीटर

    इस त्रुटि के लिए एक दुर्लभ घटना डिफ़ॉल्ट फ़ंक्शन मापदंडों के रूप में अभिव्यक्ति का उपयोग करने की कोशिश कर रही है । यह समर्थित नहीं है, यहां तक ​​कि PHP7 में भी:

    function header_fallback($value, $expires = time() + 90000) {

    एक फ़ंक्शन घोषणा में पैरामीटर केवल शाब्दिक मान या स्थिर अभिव्यक्ति हो सकते हैं। फ़ंक्शन इनवोकेशन के विपरीत, जहां आप स्वतंत्र रूप से उपयोग कर सकते हैं whatever(1+something()*2), आदि।

  2. वर्ग संपत्ति की चूक

    वर्ग सदस्य घोषणाओं के लिए एक ही बात , जहां केवल शाब्दिक / निरंतर मूल्यों की अनुमति है, अभिव्यक्ति नहीं:

    class xyz {                   
        var $default = get_config("xyz_default");

    ऐसी चीजों को कंस्ट्रक्टर में डालें। यह भी देखें कि PHP विशेषताएँ कार्यों की अनुमति क्यों नहीं देती हैं?

    फिर से ध्यान दें कि PHP 7 केवल var $xy = 1 + 2 +3;वहां निरंतर अभिव्यक्ति की अनुमति देता है।

  3. PHP में जावास्क्रिप्ट सिंटैक्स

    जावास्क्रिप्ट या jQuery वाक्यविन्यास का उपयोग PHP में स्पष्ट कारणों से काम नहीं करेगा:

    <?php      
        print $(document).text();

    जब ऐसा होता है, तो यह आमतौर पर एक पूर्ववर्ती स्ट्रिंग को इंगित करता है; और <script>PHP कोड संदर्भ में शाब्दिक अनुभाग लीक।

  4. isset (()), रिक्त, कुंजी, अगला, वर्तमान

    दोनों कार्य isset()और empty()निर्मित भाषा हैं, कार्य नहीं। उन्हें सीधे एक चर का उपयोग करने की आवश्यकता है । यदि आप अनजाने में एक जोड़ी कोष्ठक जोड़ देते हैं, तो आप एक अभिव्यक्ति बना सकते हैं:

              
    if (isset(($_GET["id"]))) {

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

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


अप्रत्याशित )

  1. अनुपस्थित फ़ंक्शन पैरामीटर

    आप एक फ़ंक्शन कॉल में अंतिम बार आवारा कॉमा नहीं कर सकते । PHP वहाँ एक मूल्य की उम्मीद करता है और इस तरह एक प्रारंभिक समापन )कोष्ठक के बारे में शिकायत करता है।

                  
    callfunc(1, 2, );

    अनुगामी अल्पविराम केवल array()या list()निर्माणों में अनुमत है ।

  2. अधूरे भाव

    यदि आप एक अंकगणितीय अभिव्यक्ति में कुछ भूल जाते हैं, तो पार्सर छोड़ देता है। क्योंकि यह संभवतः कैसे व्याख्या करना चाहिए:

                   
    $var = 2 * (1 + );

    और अगर आप समापन को )भी भूल गए , तो आपको इसके बजाय अप्रत्याशित अर्धविराम के बारे में शिकायत मिलेगी।

  3. के रूप में पहुंचें constant

    के लिए भूल चर $नियंत्रण बयान में उपसर्गों आप देखेंगे:

                           
    foreach ($array as wrong) {

    यहाँ PHP कभी-कभी आपको बताती है कि आपको इसके ::बजाय उम्मीद थी । क्योंकि एक वर्ग :: $ चर अपेक्षित $ चर अभिव्यक्ति को संतुष्ट कर सकता था।


अप्रत्याशित {

घुंघराले ब्रेसिज़ {और }कोड ब्लॉक संलग्न करें। और उनके बारे में वाक्यविन्यास त्रुटियां आमतौर पर कुछ गलत घोंसले के शिकार का संकेत देती हैं।

  1. बेजोड़ उपमेय एक में if

    आमतौर पर असंतुलित (और) वे कारण होते हैं यदि पार्सर खुलने वाले घुंघराले के बारे में शिकायत करता है {। एक सरल उदाहरण:

                                  
    if (($x == $y) && (2 == true) {

    अपने कोष्ठकों की गणना करें या एक आईडीई का उपयोग करें जो इसके साथ मदद करता है। इसके अलावा किसी भी स्थान के बिना कोड नहीं लिखें। पठनीयता मायने रखती है।

  2. {और} अभिव्यक्ति के संदर्भ में

    आप अभिव्यक्ति में घुंघराले ब्रेसिज़ का उपयोग नहीं कर सकते। यदि आप कोष्ठक और कर्ल को भ्रमित करते हैं, तो यह भाषा व्याकरण का अनुपालन नहीं करेगा:

               
    $var = 5 * {7 + $x};

    पहचानकर्ता निर्माण के लिए कुछ अपवाद हैं, जैसे स्थानीय गुंजाइश चर ${references}

  3. परिवर्तनीय चर या घुंघराले संस्करण अभिव्यक्ति

    यह बहुत दुर्लभ है। लेकिन आपको जटिल परिवर्तनशील अभिव्यक्तियों के लिए शिकायतें {और }पार्सर भी मिल सकते हैं :

                          
    print "Hello {$world[2{]} !";

    हालांकि }इस तरह के संदर्भों में अप्रत्याशित के लिए एक उच्च संभावना है।


अप्रत्याशित }

"अनपेक्षित }" त्रुटि मिलने पर, आपने ज्यादातर कोड ब्लॉक को बहुत जल्दी बंद कर दिया है।

  1. एक कोड ब्लॉक में अंतिम विवरण

    यह किसी भी असंगत अभिव्यक्ति के लिए हो सकता है।

    और यदि फ़ंक्शन / कोड ब्लॉक में अंतिम पंक्ति में अनुगामी ;अर्धविराम का अभाव होता है :

    function whatever() {
        doStuff()
    }            

    यहाँ पार्सर यह नहीं बता सकता है कि क्या आप अभी भी + 25;फ़ंक्शन परिणाम या कुछ और में जोड़ना चाहते हैं ।

  2. अमान्य ब्लॉक नेस्टिंग / भूल गए {

    जब कोड कोड }बहुत जल्दी बंद हो जाता था, या आप एक उद्घाटन {भी भूल जाते थे, तो आप कभी-कभी इस पार्सर त्रुटि को देख सकते हैं:

    function doStuff() {
        if (true)    
            print "yes";
        }
    }   

    ऊपर स्निपेट में ifएक प्रारंभिक {घुंघराले ब्रेस नहीं था । इस प्रकार }नीचे का समापन बेमानी हो गया। और इसलिए अगला समापन }, जो फ़ंक्शन के लिए अभिप्रेत था, मूल उद्घाटन {घुंघराले ब्रेस के लिए स्वीकार्य नहीं था ।

    उचित कोड इंडेंटेशन के बिना ऐसी त्रुटियां और भी कठिन हैं। एक आईडीई और ब्रैकेट मिलान का उपयोग करें।


अप्रत्याशित {, अपेक्षा(

भाषा के निर्माण के लिए एक शर्त / घोषणा शीर्षक की आवश्यकता होती है और एक कोड ब्लॉक इस त्रुटि को ट्रिगर करेगा।

  1. पैरामीटर सूची

    उदाहरण के लिए पैरामीटर सूची के बिना गलत कामों की अनुमति नहीं है:

                     
    function whatever {
    }
  2. नियंत्रण कथन की स्थिति

    और आप वैसे ही ifबिना किसी शर्त के नहीं हो सकते ।

      
    if {
    }

    जिसका कोई मतलब नहीं है, जाहिर है। सामान्य संदिग्धों के लिए एक ही बात, for/ foreach, while/ do, आदि।

    यदि आपको यह विशेष त्रुटि मिली है, तो आपको निश्चित रूप से कुछ मैनुअल उदाहरणों को देखना चाहिए।


1
इस पोस्ट में मेरे प्रश्न का उत्तर ढूंढ रहा था, लेकिन खुद को इस समस्या का उत्तर मिला - "अनपेक्षित {", इसीलिए मैं अपने उत्तर के साथ साझा करना चाहता था- मेरे लिए समस्या लाइन ब्रेकिंग एन्कोडिंग थी - किसी तरह मेरी कुछ फ़ाइलें macintosh लाइन ब्रेक का उपयोग कर रही थीं, लेकिन जब मैंने उन्हें विंडोज़ लाइन ब्रेक में बदल दिया - मेरी समस्या (लोकलहोस्ट (WAMP) सब कुछ काम करती है, लेकिन लिनक्स वेबसर्वर पर) हल नहीं हुई।
एडगर ऐवार्स

@EdgarsAivars आपकी टिप्पणी के लिए धन्यवाद! प्लेटफ़ॉर्म-विशिष्ट लाइनब्रेक वास्तव में एक असामान्य और मुश्किल मुद्दा है। मैं शायद यहाँ भी इसका उल्लेख करूँगा। (इसे अन्य संदर्भ उत्तर में अलग बताया गया था ।)
mario

मैंने पाया कि अनपेक्षित हो जाना} क्योंकि मेरे कोड के एक टुकड़े ने php लघु टैग का उपयोग किया था <? इसके बजाय <? php - मुझे यह खोजने में थोड़ा समय लगा क्योंकि यह अन्य सर्वर पर काम करता था।
c7borg

14

अप्रत्याशित $ अंत

जब PHP एक "अप्रत्याशित $end" के बारे में बात करता है , तो इसका मतलब है कि आपका कोड समय से पहले समाप्त हो गया। (संदेश शाब्दिक रूप से लिया जाने पर थोड़ा भ्रामक है। यह "$ end" नामक एक चर के बारे में नहीं है, जैसा कि कभी-कभी नए लोगों को माना जाता है। यह "फ़ाइल के अंत" को संदर्भित करता है EOF।)

कारण: असंतुलित {और }कोड ब्लॉक / और फ़ंक्शन या वर्ग घोषणाओं के लिए।

पूर्ववर्ती कोड ब्लॉक को बंद करने के लिए एक लापता घुंघराले ब्रेस के बारे में यह हमेशा बहुत अधिक होता है}

  • फिर, ऐसे मुद्दों से बचने के लिए उचित इंडेंटेशन का उपयोग करें।

  • ब्रैकेट मिलान के साथ एक आईडीई का उपयोग करें, यह पता लगाने के लिए }कि एमिस कहां है। अधिकांश IDE और टेक्स्ट संपादकों में कीबोर्ड शॉर्टकट हैं:

    • NetBeans, PhpStorm, Komodo: Ctrl[औरCtrl]
    • ग्रहण, आप्तना: CtrlShiftP
    • परमाणु, उदात्त: Ctrlm- ज़ेड स्टूडियोCtrlM
    • गीन, नोटपैड ++: CtrlB- जो: CtrlG- एमैक: C-M-n- विम:%

अधिकांश आईडीई मिलान ब्रेसिज़, कोष्ठक और कोष्ठक को भी उजागर करते हैं । जिससे उनके सहसंबंध का निरीक्षण करना बहुत आसान हो जाता है:

एक आईडीई में ब्रैकेट मिलान

अव्यक्त भाव

और Unexpected $endवाक्यविन्यास / पार्सर त्रुटि असंगत अभिव्यक्तियों या कथनों के लिए भी हो सकती है:

  • $var = func(1, ?>EOF

इसलिए, पहले स्क्रिप्ट के अंत को देखें। ;किसी भी PHP स्क्रिप्ट में अंतिम स्टेटमेंट के लिए एक अनुगामी अक्सर बेमानी होती है। लेकिन आपके पास एक होना चाहिए । संक्षेप में, क्योंकि यह ऐसे वाक्यविन्यास मुद्दों को नीचे ले जाता है।

इंडेंटेड HEREDOC मार्कर

एक और सामान्य घटना HEREDOC या NowDOC तार के साथ दिखाई देती है । समाप्ति मार्कर प्रमुख स्थानों, टैब आदि के साथ अनदेखा कर दिया जाता है।

print <<< END
    Content...
    Content....
  END;
# ↑ terminator isn't exactly at the line start

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

बच गए कोटेशन के निशान

यदि आप \एक स्ट्रिंग में उपयोग करते हैं , तो इसका एक विशेष अर्थ है। इसे " एस्केप कैरेक्टर " कहा जाता है और सामान्य रूप से पार्सर को अगले चरित्र को शाब्दिक रूप से लेने के लिए कहता है।

उदाहरण: echo 'Jim said \'Hello\'';छपेगाJim said 'hello'

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

Windows में पथ निर्दिष्ट करते समय बहुत सामान्य त्रुटि: "C:\xampp\htdocs\"गलत है। आपको चाहिए "C:\\xampp\\htdocs\\"

वैकल्पिक वाक्य रचना

टेम्प्लेट में स्टेटमेंट / कोड ब्लॉक के लिए वैकल्पिक सिंटैक्स का उपयोग करते समय कुछ हद तक आप इस सिंटैक्स त्रुटि को देख सकते हैं। उदाहरण के लिए उपयोग करना if:और else:लापता होना endif;

यह सभी देखें:


14

अप्रत्याशित T_IF
अप्रत्याशित T_ELSEIF
अप्रत्याशित T_ELSE
अनपेक्षित T_END

सशर्त नियंत्रण ब्लॉक if, elseifऔर elseएक सरल संरचना का पालन करते हैं। जब आप एक सिंटैक्स त्रुटि का सामना करते हैं, तो यह सबसे अधिक संभावना है कि अमान्य ब्लॉक नेस्टिंग → लापता {कर्ली ब्रेसिज़ के साथ }- या एक बहुत अधिक।

यहाँ छवि विवरण दर्ज करें

  1. मिसिंग {या }गलत इंडेंटेशन के कारण

    बेमेल कोड ब्रेस कम से कम अच्छी तरह से स्वरूपित कोड के लिए आम हैं:

    if((!($opt["uniQartz5.8"]!=$this->check58)) or (empty($_POST['poree']))) {if
    ($true) {echo"halp";} elseif((!$z)or%b){excSmthng(False,5.8)}elseif (False){

    यदि आपका कोड ऐसा दिखता है, तो नए सिरे से शुरुआत करें! अन्यथा यह आपके या किसी और के लिए अपरिहार्य है। मदद के लिए पूछताछ करने के लिए इंटरनेट पर इसे दिखाने का कोई मतलब नहीं है।

    आप केवल इसे ठीक करने में सक्षम होंगे, यदि आप नेत्रहीन संरचना का अनुसरण कर सकते हैं और यदि / और सशर्त और उनके {कोड ब्लॉक के संबंध हैं }। अपने IDE का उपयोग करके देखें कि क्या वे सभी जोड़े हैं।

    if (true) {
         if (false) {
                  
         }
         elseif ($whatever) {
             if ($something2) {
                 
             } 
             else {
                 
             }
         }
         else {
             
         }
         if (false) {    //   a second `if` tree
             
         }
         else {
             
         }
    }
    elseif (false) {
        
    }

    कोई भी डबल } }बस एक शाखा को बंद नहीं करेगा, लेकिन एक पिछली स्थिति संरचना। इसलिए एक कोडिंग शैली के साथ छड़ी; मिक्स एंड मैच न हो तो नेस्टेड में / वरना पेड़।

    यहां स्थिरता के अलावा, यह लंबी परिस्थितियों से भी बचने में मददगार है। अपठनीय if-expressions से बचने के लिए अस्थायी चर या कार्यों का उपयोग करें ।

  2. IF अभिव्यक्ति में इस्तेमाल नहीं किया जा सकता है

    एक आश्चर्यजनक रूप से लगातार नवागंतुक गलती ifअभिव्यक्ति में एक बयान का उपयोग करने की कोशिश कर रही है , जैसे कि एक प्रिंट स्टेटमेंट:

                       
    echo "<a href='" . if ($link == "example.org") { echo 

    जो निश्चित रूप से अमान्य है।

    आप एक टर्नरी स्थिति का उपयोग कर सकते हैं , लेकिन पठनीयता प्रभावों से सावधान रहें।

    echo "<a href='" . ($link ? "http://yes" : "http://no") . "</a>";

    अन्यथा इस तरह के आउटपुट का निर्माण टूट जाता है: कई ifएस और echoएस का उपयोग करें ।
    बेहतर अभी तक, अस्थायी चर का उपयोग करें , और अपनी शर्तों को पहले रखें:

    if ($link) { $href = "yes"; } else { $href = "no"; }
    echo "<a href='$href'>Link</a>";

    ऐसे मामलों के लिए फ़ंक्शंस या तरीकों को परिभाषित करना भी अक्सर समझ में आता है।

    नियंत्रण ब्लॉक "परिणाम" वापस नहीं करते हैं

    अब यह कम आम है, लेकिन कुछ कोडर्स भी इलाज करने की कोशिश करते हैं ifजैसे कि यह एक परिणाम दे सकता है :

    $var = if ($x == $y) { "true" };

    जो संरचित रूप से ifएक स्ट्रिंग संयोजन / अभिव्यक्ति के भीतर उपयोग करने के लिए समान है ।

    • लेकिन नियंत्रण संरचनाओं (यदि / foreach / जबकि) के पास "परिणाम" नहीं है
    • शाब्दिक स्ट्रिंग "सच" भी केवल एक शून्य कथन होगा।

    आपको कोड ब्लॉक में असाइनमेंट का उपयोग करना होगा :

    if ($x == $y) { $var = "true"; }

    वैकल्पिक रूप से, एक ?:टर्नरी तुलना का सहारा लें ।

    अगर में अगर

    आप किसी शर्त के भीतर घोंसला नहीं बना सकतेif :

                        
    if ($x == true and (if $y != false)) { ... }

    जो स्पष्ट रूप से निरर्थक है, क्योंकि and(या or) पहले से ही तुलना की अनुमति देता है।

  3. भुला दिया ;अर्धविराम

    एक बार और अधिक: प्रत्येक नियंत्रण ब्लॉक को एक बयान होना चाहिए। यदि पिछला कोड टुकड़ा अर्धविराम द्वारा समाप्त नहीं किया गया है, तो यह एक गारंटीकृत वाक्यविन्यास त्रुटि है:

                    
    $var = 1 + 2 + 3
    if (true) {  }

    Btw, एक {…}कोड ब्लॉक में अंतिम पंक्ति को एक अर्धविराम भी चाहिए।

  4. अर्धविराम बहुत जल्दी

    अब किसी विशेष कोडिंग शैली को दोष देना शायद गलत है, क्योंकि इस नुकसान की अनदेखी करना बहुत आसान है:

                
    if ($x == 5);
    {
        $y = 7;
    }
    else           
    {
        $x = -1;    
    }

    जो कि आपकी कल्पना से अधिक बार होता है।

    • जब आप इसके साथ अभिव्यक्ति समाप्त करते हैं तोif (); यह एक शून्य कथन निष्पादित करेगा। ;एक एक खाली हो जाता है {}अपनी खुद की!
    • {…}ब्लॉक इस प्रकार से अलग है if, और हमेशा भाग जाता है।
    • तो elseअब एक खुले ifनिर्माण से कोई संबंध नहीं था , यही कारण है कि यह एक अप्रत्याशित T_ELSE सिंटैक्स त्रुटि को जन्म देगा।

    जो इस सिंटैक्स त्रुटि के समान सूक्ष्म बदलाव की व्याख्या करता है:

    if ($x) { x_is_true(); }; else { something_else(); };

    जहां ;कोड ब्लॉक के बाद {…}पूरे if निर्माण को समाप्त कर दिया जाता है, elseशाखा को कृत्रिम रूप से अलग कर दिया जाता है।

  5. कोड ब्लॉक का उपयोग नहीं करना

    यह वाक्य रचना घुंघराले ब्रेसिज़ छोड़ करने की अनुमति दी है {... }कोड ब्लॉक के लिए में if/ elseif/else शाखाओं। दुख की बात है कि एक वाक्यविन्यास शैली बहुत सामान्य कोडर के लिए सामान्य है। (झूठी धारणा के तहत यह टाइप या पढ़ने के लिए तेज था)।

    हालाँकि, सिंटैक्स तक यात्रा करने की अत्यधिक संभावना है। जल्द ही या बाद में अतिरिक्त बयान अगर / अन्य शाखाओं में अपना रास्ता खोज लेंगे:

    if (true)
        $x = 5;
    elseif (false)
        $x = 6;
        $y = 7;     
    else
        $z = 0;

    लेकिन असल में कोड ब्लॉक का उपयोग करने के लिए, आप की क्या ज़रूरत है लिखने के लिए {... }इस तरह के रूप में उन्हें!

    यहां तक ​​कि अनुभवी प्रोग्रामर इस बहादुरी के सिंटैक्स से बचते हैं, या कम से कम इसे नियम के असाधारण अपवाद के रूप में समझते हैं।

  6. गलत क्रम में एल्से / एल्सीफ

    अपने आप को याद दिलाने के लिए एक चीज सशर्त आदेश है , निश्चित रूप से।

    if ($a) {  }
    else {  }
    elseif ($b) {  }
    

    आप जितने चाहें उतने elseifएस कर सकते हैं, लेकिन elseअंतिम बार जाना होगा । बस, यह कैसा है।

  7. वर्ग घोषणाएँ

    जैसा कि ऊपर उल्लेख किया गया है , आपके पास एक वर्ग घोषणा में नियंत्रण कथन नहीं हो सकता है:

    class xyz {
        if (true) {
            function ($var) {}
        }

    आप या तो फ़ंक्शन की परिभाषा भूल गए , या }ऐसे मामलों में बहुत जल्दी बंद हो गए।

  8. अनपेक्षित T_ELSEIF / T_ELSE

    जब PHP और एचटीएमएल मिश्रण, समापन }एक के लिए if/elseifएक ही पीएचपी ब्लॉक में होना चाहिए <?php ?>अगले के रूप में elseif/else। इस समापन के रूप में एक त्रुटि उत्पन्न होगा }के लिए ifकी जरूरत का हिस्सा बनने का elseif:

    <?php if ($x) { ?>
        html
    <?php } ?>
    <?php elseif ($y) { ?>
        html
    <?php } ?>

    सही रूप <?php } elseif:

    <?php if ($x) { ?>
        html
    <?php } elseif ($y) { ?>
        html
    <?php } ?>

    यह गलत इंडेंटेशन की अधिक या कम भिन्नता है - संभवतः अक्सर गलत कोडिंग इरादों के आधार पर।
    आप अन्य कथनों को इनबेट्विन if और elseif/ elseस्ट्रक्चरल टोकन को मैश नहीं कर सकते :

    if (true) {
    }
    echo "in between";    
    elseif (false) {
    }
    ?> text <?php      
    else {
    }

    या तो केवल {…}कोड ब्लॉक में हो सकता है , नियंत्रण संरचना टोकन के बीच में नहीं।

    • यह वैसे भी समझ में नहीं आएगा। यह ऐसा नहीं है कि जब PHP ifऔर elseशाखाओं के बीच कूदता है तो कुछ "अपरिभाषित" स्थिति थी ।
    • आपको अपना मन बनाना होगा जहां प्रिंट स्टेटमेंट / या दोनों शाखाओं में दोहराया जाना चाहिए।

    और न ही आप अलग-अलग नियंत्रण संरचनाओं के बीच एक / अन्य भाग कर सकते हैं :

    foreach ($array as $i) {
        if ($i) {  }
    }
    else {  }

    कोई है वाक्यात्मक संबंध के बीच ifऔर elseforeachपर शाब्दिक गुंजाइश समाप्त हो जाती है }, इसलिए वहाँ के लिए कोई मतलब नहीं है ifजारी रखने के लिए संरचना।

  9. T_ENDIF

    एक अप्रत्याशित T_ENDIF बारे में शिकायत की है, तो आप विकल्प वाक्य रचना शैली का उपयोग कर रहे if:elseif:else:endif;। जिसके बारे में आपको दो बार सोचना चाहिए।

    • एक आम नुकसान अर्धविराम के लिए एक समान :बृहदान्त्र; को भ्रमित कर रहा है । ("अर्धविराम बहुत जल्दी" में शामिल)

    • जैसा कि इंडेंटेशन टेम्प्लेट फ़ाइलों में ट्रैक करना कठिन है, वैकल्पिक सिंटैक्स का उपयोग करते समय अधिक - यह प्रशंसनीय है कि आपका endif;कोई मेल नहीं खाता है if:

    • का उपयोग करते हुए } endif; एक दोगुना है if -minminator।

    जबकि एक "अप्रत्याशित $ अंत" आम तौर पर एक भूल बंद }करी घुंघराले के लिए कीमत है ।

  10. तुलना बनाम तुलना

    तो, यह एक सिंटैक्स त्रुटि नहीं है, लेकिन इस संदर्भ में ध्यान देने योग्य है:

           
    if ($x = true) { }
    else { do_false(); }

    यह एक ==/ ===तुलना= नहीं है , लेकिन एक असाइनमेंट है । यह बल्कि सूक्ष्म है, और आसानी से कुछ उपयोगकर्ताओं को असहाय रूप से संपूर्ण स्थिति ब्लॉकों को संपादित करने का नेतृत्व करेगा। अनजाने असाइनमेंट के लिए पहले देखें - जब भी आपको लॉजिक फॉल्ट / मिसबिहेव का अनुभव हो।


11

अनपेक्षित T_IS_EQUAL
अनपेक्षित T_IS_GREATER_OR_EQUAL
अनपेक्षित T_IS_IDENTICAL
अनपेक्षित T_IS_NOT_EQUAL
अनपेक्षित T_IS_NOT_IDENTAL
अनपेक्षित T_IS_SMALLER_OR_EQUAL
अनपेक्षित <
अनपेक्षित>

जैसे तुलना ऑपरेटरों ==, >=, ===, !=, <>, !==और <=या <और >ज्यादातर सिर्फ भाव में, इस तरह के रूप में इस्तेमाल किया जाना चाहिए ifभाव। यदि पार्सर उनके बारे में शिकायत करता है, तो इसका मतलब अक्सर गलत पैरािंग या ( )उनके आस-पास बेमेल पैरेंस होता है।

  1. Parens समूहन

    ifकई तुलनाओं वाले बयानों के लिए विशेष रूप से आपको कोष्ठक को खोलने और बंद करने की सही गणना करने में ध्यान रखना चाहिए :

                            
    if (($foo < 7) && $bar) > 5 || $baz < 9) { ... }
                          

    यहाँ ifपहले से ही यहाँ की स्थिति समाप्त हो गई थी)

    एक बार जब आपकी तुलना पर्याप्त रूप से जटिल हो जाती है, तो अक्सर इसे कई और नेस्टेड ifनिर्माणों में विभाजित करने में मदद मिलती है ।

  2. isset () तुलना के साथ मैश्ड

    एक आम नवागंतुक पिटफाल की तुलना isset()या उसके empty()साथ संयोजन करने की कोशिश कर रहा है :

                            
    if (empty($_POST["var"] == 1)) {

    या और भी:

                        
    if (isset($variable !== "value")) {

    यह PHP के लिए कोई मतलब नहीं है, क्योंकि issetऔर emptyभाषा निर्माण हैं जो केवल चर नामों को स्वीकार करते हैं। इसका परिणाम की तुलना करने का कोई मतलब नहीं है, क्योंकि आउटपुट केवल / पहले से ही एक बूलियन है।

  3. सरणी ऑपरेटर के >=साथ अधिक से अधिक-या- भ्रमित =>करना

    दोनों ऑपरेटर कुछ हद तक समान दिखते हैं, इसलिए वे कभी-कभी मिश्रित हो जाते हैं:

             
    if ($var => 5) { ... }

    आपको केवल यह याद रखना होगा कि इस तुलना ऑपरेटर को " इससे बड़ा या बराबर " कहा जाता है इसे सही पाने के लिए " ।

    यह भी देखें: यदि PHP में स्टेटमेंट स्ट्रक्चर

  4. तुलना करने के लिए कुछ भी नहीं

    यदि आप एक ही चर नाम से संबंधित हैं, तो आप दो तुलनाओं को जोड़ नहीं सकते:

                     
    if ($xyz > 5 and < 100)

    PHP यह नहीं घटा सकती है कि आप शुरुआती चर की तुलना फिर से करें। अभिव्यक्तियों को आमतौर पर ऑपरेटर पूर्वता के अनुसार जोड़ा जाता है , इसलिए जब तक <देखा जाता है, तब तक मूल चर से केवल एक बूलियन परिणाम शेष होगा।

    यह भी देखें: अप्रत्याशित T_IS_SMALLER_OR_EQUAL

  5. तुलना श्रृंखला

    आप ऑपरेटरों की एक पंक्ति के साथ एक चर के खिलाफ तुलना नहीं कर सकते हैं:

                      
     $reult = (5 < $x < 10);

    इसे दो तुलनाओं में तोड़ना होगा, प्रत्येक के खिलाफ $x

    यह वास्तव में ब्लैकलिस्टेड अभिव्यक्तियों (समकक्ष ऑपरेटर समरूपता के कारण) का मामला है। यह कुछ सी-शैली भाषाओं में वाक्यात्मक रूप से मान्य है, लेकिन PHP इसे अपेक्षित तुलना श्रृंखला के रूप में व्याख्या नहीं करेगा।

  6. अनपेक्षित >
    अप्रत्याशित<

    ऑपरेटर्स की >तुलना में अधिक या उससे कम का <कस्टम T_XXXटोकन नाम नहीं है। और जब वे सभी दूसरों की तरह गलत तरीके से रखे जा सकते हैं, तो आप अक्सर पार्सर को उनके बारे में गलत तरीके से स्ट्रिंग और मैश किए हुए HTML के लिए शिकायत करते हुए देख सकते हैं:

                            
    print "<a href='z">Hello</a>";
                     ↑

    एक स्ट्रिंग के लिए यह मात्रा में "<a href='z"तुलना की जा रही >एक शाब्दिक लगातार करने के लिए Helloऔर फिर एक और <तुलना। या कि कम से कम PHP इसे कैसे देखता है। वास्तविक कारण और वाक्यविन्यास की गलती समयपूर्व स्ट्रिंग "समाप्ति थी।

    PHP प्रारंभ टैग को घोंसला बनाना भी संभव नहीं है:

    <?php echo <?php my_func(); ?>

यह सभी देखें:


11

अनपेक्षित T_IF
अनपेक्षित T_FOREACH
अनपेक्षित T_FOR
अनपेक्षित T_WHILE
अनपेक्षित T_DO
अनपेक्षित T_OO

नियंत्रण निर्माण करती है जैसे if, foreach, for, while, list, global, return, do, print, echoकेवल बयानों के रूप में इस्तेमाल किया जा सकता है। वे आम तौर पर एक लाइन पर खुद से रहते हैं।

  1. अर्द्धविराम; आप कहाँ हैं?

    अगर आप एक नियंत्रण कथन के बारे में शिकायत करते हैं तो सार्वभौमिक रूप से आप पिछली पंक्ति में अर्धविराम से चूक गए हैं :

                 
    $x = myfunc()
    if (true) {

    समाधान: पिछली पंक्ति में देखें; अर्धविराम जोड़ें।

  2. वर्ग घोषणाएँ

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

    class xyz {
        if (true) {}
        foreach ($var) {}

    इस तरह की वाक्यविन्यास त्रुटियां आमतौर पर गलत तरीके से निहित {और के लिए भौतिक होती हैं }। विशेष रूप से जब फ़ंक्शन कोड ब्लॉक बहुत जल्दी बंद हो गए।

  3. अभिव्यक्ति के संदर्भ में कथन

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

                       
    $var = array(1, 2, foreach($else as $_), 5, 6);

    इसी तरह आप ifतार, गणित के भाव या अन्य जगहों पर उपयोग नहीं कर सकते हैं:

                   
    print "Oh, " . if (true) { "you!" } . " won't work";
    // Use a ternary condition here instead, when versed enough.

    ifविशेष रूप से अभिव्यक्ति में एम्बेडिंग जैसी स्थितियों के लिए , आप अक्सर एक ?:टर्नरी मूल्यांकन का उपयोग करना चाहते हैं ।

    एक ही लागू होता है for, while, global, echoऔर कुछ हद का विस्तार list

              
    echo 123, echo 567, "huh?";

    जबकि print()एक ऐसी भाषा है जिसका निर्माण अभिव्यक्ति के संदर्भ में किया जा सकता है। (लेकिन शायद ही कभी समझ में आता है।)

  4. आरक्षित खोजशब्दों को पहचानकर्ता के रूप में

    आप उपयोगकर्ता-परिभाषित फ़ंक्शंस या वर्ग नामों के लिए भी doया ifअन्य भाषा निर्माण का उपयोग नहीं कर सकते । (शायद PHP 7 में। लेकिन फिर भी यह उचित नहीं होगा।)


7

अनपेक्षित '?'

यदि आप ??PHP 7 से पहले PHP के एक संस्करण में अशक्त coalescing ऑपरेटर का उपयोग करने की कोशिश कर रहे हैं, तो आपको यह त्रुटि मिलेगी।

<?= $a ?? 2; // works in PHP 7+
<?= (!empty($a)) ? $a : 2; // All versions of PHP

अप्रत्याशित '?', चर की उम्मीद है

एक समान त्रुटि अशक्त प्रकारों के लिए हो सकती है, जैसे:

function add(?int $sum): ?int {

जो फिर से उपयोग किए जा रहे एक पुराने PHP संस्करण को इंगित करता है (या तो CLI संस्करण php -vया एक बाध्य वेबर phpinfo();)।


5

अनपेक्षित T_LNUMBER

टोकन T_LNUMBERएक "लंबी" / संख्या को संदर्भित करता है।

  1. अमान्य चर नाम

    PHP, और अधिकांश अन्य प्रोग्रामिंग भाषाओं में, चर एक संख्या से शुरू नहीं हो सकते हैं। पहले वर्ण में अक्षर या अंडरस्कोर होना चाहिए।

    $1   // Bad
    $_1  // Good

    *

    • अक्सर PHP के संदर्भ में -होल्डर का उपयोग करने के लिए काफी कुछ आता है:preg_replace"$1"

      #                         ↓            ⇓  ↓
      preg_replace("/#(\w+)/e",  strtopupper($1) )

      जहां कॉलबैक को उद्धृत किया जाना चाहिए था। (अब /eregex ध्वज को हटा दिया गया है। लेकिन यह कभी-कभी preg_replace_callbackफ़ंक्शंस में दुरुपयोग होता है।)

    • एक ही पहचानकर्ता बाधा वस्तु गुणों , btw पर लागू होती है ।

             
      $json->0->value
    • जबकि टोकन / पार्सर एक शाब्दिक $1चर नाम के रूप में अनुमति नहीं देता है , कोई भी उपयोग ${1}कर सकता है या ${"1"}। जो गैर-मानक पहचानकर्ताओं के लिए एक वाक्यात्मक समाधान है। (स्थानीय स्कोप लुकअप के रूप में इसके बारे में सोचना सबसे अच्छा है। लेकिन आम तौर पर ऐसे मामलों के लिए सादे सरणियों को प्राथमिकता दें!)

    • मनोरंजक रूप से, लेकिन बहुत अनुशंसित नहीं है, PHP पार्सर यूनिकोड-पहचानकर्ताओं को अनुमति देता है; ऐसा $➊मान्य होगा। (एक शाब्दिक के विपरीत 1)।

  2. आवारा सरणी प्रवेश

    सरणी घोषणाओं के लिए एक अप्रत्याशित लंबा भी हो सकता है - जब लापता ,अल्पविराम:

    #            ↓ ↓
    $xy = array(1 2 3);

    या इसी तरह समारोह कॉल और घोषणाओं, और अन्य निर्माण:

    • func(1, 2 3);
    • function xy($z 2);
    • for ($i=2 3<$z)

    इसलिए आमतौर पर सूचियों या भावों को अलग करने के लिए एक ;या ,गायब है।

  3. गलत HTML

    और फिर, गलत तरीके से भटके हुए लोग, आवारा संख्याओं के लगातार स्रोत हैं:

    #                 ↓ ↓          
    echo "<td colspan="3">something bad</td>";

    ऐसे मामलों को कम या ज्यादा अनपेक्षित T_STRING त्रुटियों की तरह माना जाना चाहिए ।

  4. अन्य पहचानकर्ता

    न तो फ़ंक्शंस, कक्षाएं, और न ही नामस्थानों को एक नंबर के साथ शुरुआत में नामित किया जा सकता है:

             
    function 123shop() {

    चर नामों के लिए बहुत समान है।


2

अनपेक्षित '='

यह एक चर नाम में अमान्य वर्ण होने के कारण हो सकता है। चर नाम इन नियमों का पालन करना चाहिए :

चर नाम PHP में अन्य लेबल के समान नियमों का पालन करते हैं। एक वैध चर नाम एक अक्षर या अंडरस्कोर से शुरू होता है, उसके बाद किसी भी संख्या में अक्षर, संख्या या अंडरस्कोर। एक नियमित अभिव्यक्ति के रूप में, यह इस प्रकार व्यक्त किया जाएगा: '[a-zA-Z_ \ x7f- \ xff] [a-zA-Z0-9_ \ x7f- \ xff] *'


अच्छा जोड़ जॉन।
फंक फोर्टी निनेर

1

अनपेक्षित 'जारी' (T_CONTINUE)

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

इसका मतलब है कि continueएक टर्नरी स्टेटमेंट या किसी भी स्टेटमेंट में इस्तेमाल नहीं किया जा सकता है जिसमें रिटर्न वैल्यू की आवश्यकता होती है।

अनपेक्षित 'ब्रेक' (T_BREAK)

उसी के लिए जाता है break;। यह अभिव्यक्ति के संदर्भ में भी प्रयोग करने योग्य नहीं है, लेकिन एक सख्त बयान (उसी स्तर पर foreachया ifब्लॉक के रूप में)।

अप्रत्याशित 'वापसी' (T_RETURN)

अब यह और अधिक आश्चर्यजनक हो सकता है return, लेकिन यह भी सिर्फ एक ब्लॉक-स्तर का बयान है । यह उच्च मान / फ़ंक्शन के लिए कोई मान (या NULL) लौटाता है, लेकिन यह स्वयं के रूप में मूल्यांकन नहीं करता है। → यह है: ऐसा करने का कोई मतलब नहीं हैreturn(return(false);;


1

अनपेक्षित '।'

यह तब हो सकता है यदि आप PHP के असमर्थित संस्करण में स्पैट ऑपरेटर ( ...) का उपयोग करने का प्रयास कर रहे हैं ।

... किसी फ़ंक्शन के चर संख्याओं को कैप्चर करने के लिए PHP 5.6 में पहली बार उपलब्ध हुआ:

function concatenate($transform, ...$strings) {
    $string = '';
    foreach($strings as $piece) {
        $string .= $piece;
    }
    return($transform($string));
}

echo concatenate("strtoupper", "I'd ", "like ", 4 + 2, " apples");
// This would print:
// I'D LIKE 6 APPLES

PHP 7.4 में, आप इसे ऐरे एक्सप्रेशन के लिए इस्तेमाल कर सकते हैं ।

$parts = ['apple', 'pear'];
$fruits = ['banana', 'orange', ...$parts, 'watermelon'];
// ['banana', 'orange', 'apple', 'pear', 'watermelon'];

0

अनपेक्षित 'अंतिम' (T_ENDWHILE)

उपनिवेश एक बृहदान्त्र का उपयोग कर रहा है - अगर कोई बृहदान्त्र नहीं है तो उपरोक्त त्रुटि उत्पन्न होगी।

<?php while($query->fetch()): ?>
 ....
<?php endwhile; ?>

इस सिंटैक्स का विकल्प घुंघराले कोष्ठक का उपयोग कर रहा है:

<?php while($query->fetch()) { ?>
  ....
<?php } ?>

http://php.net/manual/en/control-structures.while.php


0

एक त्रुटि संदेश जो शुरू होता है Parse error: syntax error, unexpected ':'वह गलती से एक क्लास स्टेटिक संदर्भ के Class::$Variableरूप में लिख सकता है Class:$Variable

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