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




parsing debugging (11)

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

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

  1. समारोह घोषणा पैरामीटर

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

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

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

  2. कक्षा संपत्ति डिफ़ॉल्ट

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

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

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

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

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

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

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

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

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

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

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

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

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


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

  1. अनुपस्थित समारोह पैरामीटर

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

                  ⇓
    callfunc(1, 2, );
    

    एक पिछला कॉमा केवल array() या list() संरचनाओं में ही अनुमति दी जाती है।

  2. अपूर्ण अभिव्यक्तियां

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

                   ⇓
    $var = 2 * (1 + );
    

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

  3. constant रूप में Foreach

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

                       ↓    ⇓
    foreach ($array as wrong) {
    

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


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

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

  1. if एक में बेजोड़ subexpressions

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

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

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

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

    You can't use curly braces in expressions. If you confuse parentheses and curlys, it won't comply to the language grammer:

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

    There are a few exceptions for identifier construction, such as local scope variable ${references} .

  3. Variable variables or curly var expressions

    This is pretty rare. But you might also get { and } parser complaints for complex variable expressions:

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

    Though there's a higher likelihood for an unexpected } in such contexts.


Unexpected }

When getting an "unexpected } " error, you've mostly closed a code block too early.

  1. Last statement in a code block

    It can happen for any unterminated expression.

    And if the last line in a function/code block lacks a trailing ; semicolon:

    function whatever() {
        doStuff()
    }            ⇧
    

    Here the parser can't tell if you perhaps still wanted to add + 25; to the function result or something else.

  2. Invalid block nesting / Forgotten {

    You'll sometimes see this parser error when a code block was } closed too early, or you forgot an opening { even:

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

    In above snippet the if didn't have an opening { curly brace. Thus the closing } one below became redundant. And therefore the next closing } , which was intended for the function, was not associatable to the original opening { curly brace.

    Such errors are even harder to find without proper code indentation. Use an IDE and bracket matching.


Unexpected { , expecting (

Language constructs which require a condition/declaration header and a code block will trigger this error.

  1. Parameter lists

    For example misdeclared functions without parameter list are not permitted:

                     ⇓
    function whatever {
    }
    
  2. Control statement conditions

    And you can't likewise have an if without condition .

      ⇓
    if {
    }
    

    Which doesn't make sense, obviously. The same thing for the usual suspects, for / foreach , while / do , etc.

    If you've got this particular error, you definitely should look up some manual examples.

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

PHP पार्स त्रुटि: सिंटैक्स त्रुटि, लाइन 20 पर index.php में अप्रत्याशित '{'

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

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

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

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

तथा:

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

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

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


Unexpected T_IS_EQUAL
Unexpected T_IS_GREATER_OR_EQUAL
Unexpected T_IS_IDENTICAL
Unexpected T_IS_NOT_EQUAL
Unexpected T_IS_NOT_IDENTICAL
Unexpected T_IS_SMALLER_OR_EQUAL
Unexpected <
Unexpected >

Comparison operators such as == , >= , === , != , <> , !== and <= or < and > mostly should be used just in expressions, such as if expressions. If the parser complains about them, then it often means incorrect paring or mismatched ( ) parens around them.

  1. Parens grouping

    In particular for if statements with multiple comparisons you must take care to correctly count opening and closing parenthesis :

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

    Here the if condition here was already terminated by the )

    Once your comparisons become sufficiently complex it often helps to split it up into multiple and nested if constructs rather.

  2. isset() mashed with comparing

    A common newcomer is pitfal is trying to combine isset() or empty() with comparisons:

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

    Or even:

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

    This doesn't make sense to PHP, because isset and empty are language constructs that only accept variable names. It doesn't make sense to compare the result either, because the output is only/already a boolean.

  3. Confusing >= greater-or-equal with => array operator

    Both operators look somewhat similar, so they sometimes get mixed up:

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

    You only need to remember that this comparison operator is called " greater than or equal " to get it right.

    See also: If statement structure in PHP

  4. Nothing to compare against

    You also can't combine two comparisons if they pertain the same variable name:

                     ⇓
    if ($xyz > 5 and < 100)
    

    PHP can't deduce that you meant to compare the initial variable again. Expressions are usually paired according to operator precedence , so by the time the < is seen, there'd be only a boolean result left from the original variable.

    See also: unexpected T_IS_SMALLER_OR_EQUAL

  5. Comparison chains

    You can't compare against a variable with a row of operators:

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

    This has to be broken up into two comparisons, each against $x .

    This is actually more a case of blacklisted expressions (due to equivalent operator associativity). It's syntactically valid in a few C-style languages, but PHP wouldn't interpret it as expected comparison chain either.

  6. Unexpected >
    Unexpected <

    The greater than > or less than < operators don't have a custom T_XXX tokenizer name. And while they can be misplaced like all they others, you more often see the parser complain about them for misquoted strings and mashed HTML:

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

    This amounts to a string "<a href='z" being compared > to a literal constant Hello and then another < comparison. Or that's at least how PHP sees it. The actual cause and syntax mistake was the premature string " termination.

यह भी देखें:


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

इन दिनों, अप्रत्याशित [ सरणी ब्रैकेट आमतौर पर पुराने PHP संस्करणों पर देखा जाता है। लघु सरणी वाक्यविन्यास 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 संस्करणों के साथ वास्तव में चिपचिपा हैं तो प्रीप्रोसेसर और PHP 5.4 सिंटैक्स डाउन-कन्वर्टर्स भी हैं।

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

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

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

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

    foreach [$a as $b)
            ⇑
    

    या और भी:

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

    $var = const[123];
           ⇑
    

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

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


अप्रत्याशित ] क्लोजिंग स्क्वायर ब्रैकेट

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

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

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

    $var = 2];
    

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

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

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


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

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

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

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

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

    एक लगातार दुर्घटनाग्रस्त होने के साथ स्ट्रिंग concatenations हैं . ऑपरेटर:

                                   ⇓
    print "Here comes the value: "  $value;
    

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

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

  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();
    

    बीटीडब्ल्यू, यह एक आम उदाहरण है जहां इरादा चर वैरिएबल का उपयोग करना था। इस मामले में $this->{"myFunc$VAR"}(); साथ एक परिवर्तनीय संपत्ति लुकअप $this->{"myFunc$VAR"}(); उदाहरण के लिए।

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

  7. भाषा संरचनाओं के बाद माता-पिता गुम हो गए

    गंदे टाइपिंग के कारण और foreach बयान के for खुले उद्घाटन को भूलना पड़ सकता है:

           ⇓
    foreach $array as $key) {
    

    समाधान: गायब उद्घाटन ( कथन और चर के बीच जोड़ें।

  8. अन्यथा शर्तों की अपेक्षा नहीं करता है

         ⇓
    else ($var >= 0)
    

    समाधान: अन्य स्थितियों को हटाएं या elseif उपयोग करें।

  9. बंद करने के लिए ब्रैकेट की आवश्यकता है

         ⇓
    function() uses $var {}
    

    समाधान: $var आसपास ब्रैकेट जोड़ें।

  10. अदृश्य सफेद जगह

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

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

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

यह भी देखें


Unexpected T_LNUMBER

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

$1   // Bad
$_1  // Good

Unexpected '?'

If you are trying to use the null coalescing operator ?? in a version of PHP prior to PHP 7 you will get this error.

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

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

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

सबसे महत्वपूर्ण सुझाव

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

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

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

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

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

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

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

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

एक moniker जैसे T_STRING बताता है कि कौन सा प्रतीक पार्सर / टोकनेज़र अंततः संसाधित नहीं कर सका। यह आवश्यक रूप से वाक्यविन्यास गलती का कारण नहीं है।

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

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

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

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

    • भागने वाले तारों और गलत स्थानांतरित ऑपरेटरों के लिए यह आम तौर पर आपको अपराधी मिलते हैं।

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

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

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

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

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

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

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

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

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

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

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

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

    • if परिस्थितियों में अलग-अलग या घोंसले में बयानों को जटिल बनाया if जटिल if

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

    • के बीच नई लाइनें जोड़ें:

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

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

  • अपमानजनक कोड टिप्पणी करें

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

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

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

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

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

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

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

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

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

    • " या " लिए बेमेल स्ट्रिंग उद्धरण और बिना सहेजे गए उद्धरण।

    • विशेष रूप से स्ट्रिंग के लिए भूल गए ऑपरेटर . संयोजन।

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

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

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

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

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

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

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

    • विशेष रूप से बीओएम, शून्य-चौड़ाई वाली जगहें, या गैर-ब्रेकिंग रिक्त स्थान, और नियमित रूप से स्मार्ट कोट्स स्रोत कोड में अपना रास्ता ढूंढ सकते हैं।

  • फाइलों में किस प्रकार के लाइनब्रेक सहेजे गए हैं इसका ख्याल रखें।

    • PHP सिर्फ सम्मान \ n न्यूलाइन, \ r कैरिज रिटर्न नहीं।

    • जो कभी-कभी मैकोज़ उपयोगकर्ताओं के लिए एक मुद्दा है (यहां तक ​​कि गलत कॉन्फ़िगर किए गए संपादकों के लिए ओएस एक्स पर भी)।

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

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

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

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

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

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

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

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

आगे गाइड:

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

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

  • error_reporting = E_ALL
  • display_errors = 1

अपने php.ini , या mod_php के लिए .htaccess के माध्यम से, या यहां तक ​​कि .user.ini को FastCGI सेटअप के साथ।

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

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

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

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


Unexpected T_IF
Unexpected T_ELSEIF
Unexpected T_ELSE
Unexpected T_ENDIF

Conditional control blocks if , elseif and else follow a simple structure. When you encounter a syntax error, it's most likely just invalid block nesting → with missing { curly braces } - or one too many.

  1. Missing { or } due to incorrect indentation

    Mismatched code braces are common to less well-formatted code such as:

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

    If your code looks like this, start afresh! Otherwise it's unfixable to you or anyone else. There's no point in showcasing this on the internet to inquire for help.

    You will only be able to fix it, if you can visually follow the nested structure and relation of if/else conditionals and their { code blocks } . Use your IDE to see if they're all paired.

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

    Any double } } will not just close a branch, but a previous condition structure. Therefore stick with one coding style; don't mix and match in nested if/else trees.

    Apart from consistency here, it turns out helpful to avoid lengthy conditions too. Use temporary variables or functions to avoid unreadable if -expressions.

  2. IF cannot be used in expressions

    A surprisingly frequent newcomer mistake is trying to use an if statement in an expression, such as a print statement:

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

    Which is invalid of course.

    You can use a ternary conditional , but beware of readability impacts.

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

    Otherwise break such output constructs up: use multiple if s and echo s .
    Better yet, use temporary variables , and place your conditionals before:

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

    Defining functions or methods for such cases often makes sense too.

    Control blocks don't return "results"

    Now this is less common, but a few coders even try to treat if as if it could return a result :

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

    Which is structurally identical to using if within a string concatenation / expression.

    • But control structures (if / foreach / while) don't have a "result" .
    • The literal string "true" would also just be a void statement.

    You'll have to use an assignment in the code block :

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

    Alternatively, resort to a ?: ternary comparison.

    If in If

    You cannot nest an if within a condition either:

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

    Which is obviously redundant, because the and (or or ) already allows chaining comparisons.

  3. Forgotton ; semicolons

    Once more: Each control block needs to be a statement. If the previous code piece isn't terminated by a semicolon, then that's a guaranteed syntax error:

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

    Btw, the last line in a {…} code block needs a semicolon too.

  4. Semicolon too early

    Now it's probably wrong to blame a particular coding style, as this pitfall is too easy to overlook:

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

    Which happens more often than you might imagine.

    • When you terminate the if () expression with ; it will execute a void statement. The ; becomes a an empty {} of its own!
    • The {…} block thus is detached from the if , and would always run.
    • So the else no longer had a relation to an open if construct, which is why this would lead to an Unexpected T_ELSE syntax error.

    Which also explains a likewise subtle variation of this syntax error:

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

    Where the ; after the code block {…} terminates the whole if construct, severing the else branch syntactically.

  5. Not using code blocks

    It's syntactically allowed to omit curly braces {} for code blocks in if / elseif / else branches. Which sadly is a syntax style very common to unversed coders. (Under the false assumption this was quicker to type or read).

    However that's highly likely to trip up the syntax. Sooner or later additional statements will find their way into the if/else branches:

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

    But to actually use code blocks, you do have to write {} them as such!

    Even seasoned programmers avoid this braceless syntax, or at least understand it as an exceptional exception to the rule.

  6. Else / Elseif in wrong order

    One thing to remind yourself is the conditional order , of course.

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

    You can have as many elseif s as you want, but else has to go last . That's just how it is.

  7. Class declarations

    As mentioned above , you can't have control statements in a class declaration:

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

    You either forgot a function definition, or closed one } too early in such cases.

  8. Unexpected T_ELSEIF / T_ELSE

    This is more or less a variation of incorrect indentation - presumably often based on wrong coding intentions.
    You cannot mash other statements inbetween if and elseif / else structural tokens:

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

    Either can only occur in {…} code blocks, not in between control structure tokens.

    • This wouldn't make sense anyway. It's not like that there was some "undefined" state when PHP jumps between if and else branches.
    • You'll have to make up your mind where print statements belong to / or if they need to be repeated in both branches.

    Nor can you part an if/else between different control structures:

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

    There is no syntactic relation between the if and else . The foreach lexical scope ends at } , so there's no point for the if structure to continue.

  9. T_ENDIF

    If an unexpected T_ENDIF is complained about, you're using the alternative syntax style if:elseif:else:endif; । Which you should really think twice about.

    • A common pitfall is confusing the eerily similar : colon for a ; semicolon . (Covered in "Semicolon too early")

    • As indentation is harder to track in template files, the more when using the alternative syntax - it's plausible your endif; does not match any if: .

    • Using } endif; is a doubled if -terminator.

    While an "unexpected $end" is usually the price for a forgotten closing } curly brace.

  10. Assignment vs. comparison

    So, this is not a syntax error, but worth mentioning in this context:

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

    That's not a == / === comparison, but an = assignment . This is rather subtle, and will easily lead some users to helplessly edit whole condition blocks. Watch out for unintended assignments first - whenver you experience a logic fault / misbeheviour.


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

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

  1. Misquoted तारों

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

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

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

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

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

  2. अनजान तार

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

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

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

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

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

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

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

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

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

           ⇓
    func1()
    function2();
    

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

  5. PHP स्क्रिप्ट में लघु खुले टैग और <?xml शीर्षलेख

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

          ⇓
    <?xml version="1.0"?>
    

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

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

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

    <?php
        print 123;
    

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

    आप अनावश्यक जोड़ने के साथ इसे कम कर सकते हैं ; प्रत्येक पंक्ति पर बयान विभाजक शुरू होते हैं:

    <?php
        ;print 123;
    

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

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

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

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

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


अप्रत्याशित T_CONSTANT_ENCAPSED_STRING
अप्रत्याशित T_ENCAPSED_AND_WHITESPACE

T_CONSTANT_ENCAPSED_STRING नाम T_CONSTANT_ENCAPSED_STRING और T_ENCAPSED_AND_WHITESPACE उद्धृत "string" T_ENCAPSED_AND_WHITESPACE संदर्भ लें।

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

  1. गलत परिवर्तनीय इंटरपोलेशन

    और यह गलत PHP परिवर्तनीय इंटरपोलेशन के लिए अक्सर आता है:

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

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

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

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

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

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

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

  2. लापता concatenation

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

                           ⇓
    print "Hello " . WORLD  " !";
    

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

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

    स्ट्रिंग delimiters confounding जब एक ही वाक्यविन्यास त्रुटि होती है । एक सिंगल या डबल " कोट द्वारा शुरू की गई स्ट्रिंग भी इसके साथ समाप्त होती है।

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

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

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

    यह एक अच्छा उदाहरण है जहां आपको पहले स्थान पर डबल कोट्स से बाहर नहीं होना चाहिए। इसके बजाय बस उचित \" 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 एक दूसरे के बाद सीधे दो स्ट्रिंग अक्षर की शिकायत करता है। लेकिन वास्तविक कारण पाठ्यक्रम की अनदेखी पिछली स्ट्रिंग है।

यह भी देखें


Unexpected $end

When PHP talks about an "unexpected $end ", it means that your code ended prematurely. (The message is a bit misleading when taken literally. It's not about a variable named "$end", as sometimes assumed by newcomers. It refers to the "end of file", EOF .)

Cause: Unbalanced { and } for code blocks / and function or class declarations.

It's pretty much always about a missing } curly brace to close preceding code blocks.

  • Again, use proper indentation to avoid such issues.

  • Use an IDE with bracket matching, to find out where the } is amiss. There are keyboard shortcuts in most IDEs and text editors:

    • NetBeans, PhpStorm, Komodo: Ctrl [ and Ctrl ]
    • Eclipse, Aptana: Ctrl Shift P
    • Atom, Sublime: Ctrl m - Zend Studio Ctrl M
    • Geany, Notepad++: Ctrl B - Joe: Ctrl G - Emacs: CMn - Vim: %

Most IDEs also highlight matching braces, brackets and parentheses. Which makes it pretty easy to inspect their correlation:

Unterminated expressions

And Unexpected $end syntax/parser error can also occur for unterminated expressions or statements:

  • $var = func(1, ?> EOF

So, look at the end of scripts first. A trailing ; is often redundant for the last statement in any PHP script. But you should have one. Precisely because it narrows such syntax issues down.

Indented HEREDOC markers

Another common occurrence appears with HEREDOC or NOWDOC strings. The terminating marker goes ignored with leading spaces, tabs, etc.:

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

Therefore the parser assumes the HEREDOC string to continue until the end of the file (hence "Unexpected $end"). Pretty much all IDEs and syntax-highlighting editors will make this obvious or warn about it.

Alternative syntax

Somewhat rarer you can see this syntax error when using the alternative syntax for statement/code blocks in templates. Using if: and else: and a missing endif; उदाहरण के लिए।

यह भी देखें:





syntax-error