Erori de parse/sintaxa PHP; și cum să le rezolvăm?
Toată lumea se confruntă cu erori de sintaxă. Chiar și programatorii experimentați fac greșeli de scriere. Pentru începători, face parte din procesul de învățare. Cu toate acestea, este adesea ușor de interpretat mesajele de eroare de genul:
PHP Parse error: syntax error, unexpected '{' in index.php on line 20 Simbolul neașteptat nu este'întotdeauna adevăratul vinovat. Dar numărul liniei oferă o idee aproximativă despre unde să începi să cauți. Întotdeauna uitați-vă la contextul codului. Greșeala de sintaxă se ascunde adesea în sau în linii de cod anterioare menționate. Comparați codul dvs. cu exemplele de sintaxă din manual. Deși nu toate cazurile se potrivesc cu celelalte. Cu toate acestea, există câțiva pași generali pentru rezolvarea greșelilor de sintaxă. Aceste referințe au rezumat capcanele comune:
- T_STRING neașteptat
- Unexpected T_VARIABLE
Unexpected '$varname' (T_VARIABLE)- Unexpected T_CONSTANT_ENCAPSED_STRING
Unexpected T_ENCAPSED_AND_WHITESPACE- Unexpected $end
- Unexpected T_FUNCTION...
- Unexpected
{
Unexpected}
Unexpected(
Unexpected)
](https://stackoverflow.com/a/18092308)- [Unexpected
[
Unexpected]
]](https://stackoverflow.com/a/29505827)- Unexpected T_IF
Unexpected T_FOREACH
Unexpected T_FOR
Unexpected T_WHILE
Unexpected T_DO
Unexpected T_PRINT
Unexpected T_ECHO- Unexpected T_LNUMBER
- Unexpected ?
- Unexpected continue (T_CONTINUE)
Unexpected continue (T_BREAK)
Unexpected continue (T_RETURN)- Unexpected '='
- Unexpected T_INLINE_HTML...
- Unexpected T_PAAMAYIM_NEKUDOTAYIM...
- Unexpected T_OBJECT_OPERATOR...
- Unexpected T_DOUBLE_ARROW...
- Unexpected T_SL...
- Unexpected T_BOOLEAN_OR...
Unexpected T_BOOLEAN_AND...- Unexpected T_IS_EQUAL
Unexpected T_IS_GREATER_OR_EQUAL
Unexpected T_IS_IDENTICAL
Neașteptat T_IS_NOT_EQUAL
Unexpected T_IS_NOT_IDENTICAL
Unexpected T_IS_SMALLER_OR_EQUAL
Neașteptat<
Neașteptat>
- Unexpected T_NS_SEPARATOR...
- Caracter neașteptat în intrare: '
\
' (ASCII=92) state=1- Unexpected 'public' (T_PUBLIC)
Unexpected 'private' (T_PRIVATE)
Unexpected 'protected' (T_PROTECTED)
Unexpected 'final' (T_FINAL)...- Unexpected T_STATIC...
- Unexpected T_CLASS...
- Unexpected T_DNUMBER
- Unexpected
,
(virgulă)- Unpexected
.
(punct)- Unexpected
;
(punct și virgulă) Unexpected;
(punct și virgulă)- Unexpected
*
(asterisc) Unexpected*
(asterisc)- Unexpected
:
(două puncte) Referințe înrudite îndeaproape:- Ce înseamnă această eroare în PHP? (erori de execuție)
- Parse error: syntax error, unexpected T_XXX
- Parse error: syntax error, unexpected T_ENCAPSED_AND_WHITESPACE
- Parse error: syntax error, unexpected T_VARIABLE
- Ce înseamnă acest simbol în PHP? (simboluri de limbaj)
- Aceste ghilimele
""
inteligente''
nu înseamnă nimic pentru PHP Și:
- Manualul PHP de pe php.net și diversele sale simboluri de limbaj
- Sau Wikipedia's syntax introduction on PHP.
- Și, în cele din urmă, php tag-wiki al nostru, desigur. În timp ce Stack Overflow primește și programatori începători, acesta se adresează în principal întrebărilor profesionale de programare.
- Răspunsul la greșelile de codare și greșelile de tipar înguste ale tuturor este considerat în mare parte off-topic.
- Așa că vă rugăm să vă faceți timp să urmați pașii de bază, înainte de a posta cereri de corectare a sintaxei.
Dacă totuși trebuie, vă rugăm să arătați propria inițiativă de rezolvare, încercările de remediere și procesul de gândire cu privire la ceea ce pare sau ar putea fi greșit. Dacă browserul dvs. afișează mesaje de eroare de genul "SyntaxError: illegal character", atunci'nu este de fapt [tag:php], ci o [tag:javascript]-eroare de sintaxă.
Erorile de sintaxă generate de codul furnizorului: În cele din urmă, luați în considerare faptul că, dacă eroarea de sintaxă nu a fost generată prin editarea bazei dumneavoastră de cod, ci în urma instalării sau actualizării pachetului unui furnizor extern, aceasta s-ar putea datora incompatibilității versiunii PHP, deci verificați cerințele furnizorului în raport cu configurația platformei dumneavoastră.
Care sunt erorile de sintaxă?
PHP aparține limbajelor de programare stil C și imperativ. Acesta are reguli gramaticale rigide, pe care nu le poate recupera atunci când întâlnește simboluri sau identificatori greșit plasați. Nu vă poate ghici intențiile de codare.
Cele mai importante sfaturi
Există câteva precauții de bază pe care le puteți lua întotdeauna:
Folosiți o indentare corespunzătoare a codului, sau adoptați orice stil de codare elevat. Lizibilitatea previne neregulile.
Folosiți un IDE sau un editor pentru PHP cu semnalizare de sintaxă. Care ajută, de asemenea, la echilibrarea parantezelor/parantezelor.
Citiți referința limbajului și exemplele din manual. De două ori, pentru a deveni oarecum competent.
Cum se interpretează erorile parserului
Un mesaj tipic de eroare de sintaxă sună astfel::
Deschideți fișierul sursă menționat. Uitați-vă la linia de cod menționată.
Mai regulat, trebuie să vă uitați și la linii precedente.
;
la capetele de linie/la declarațiile anterioare. (Cel puțin din punct de vedere stilistic. ){
blocuri de cod `}`` sunt închise sau imbricate incorect, s-ar putea să trebuiască să investigați și mai sus în codul sursă. Folosiți o indentare corespunzătoare a codului pentru a simplifica acest lucru.Uitați-vă la colorizarea sintaxei!
+-*/.
ar trebui să fie și ei colorați distinct. Altfel, ar putea fi în context greșit."
sau'
neescapsulat sau lipsă.++
,--
sau paranteze după un operator. Două șiruri de caractere/identificatori care urmează direct unul după altul sunt incorecte în majoritatea contextelor.Spațiul alb este prietenul tău. Urmați orice stil de codare.
Despărțiți temporar liniile lungi.
if
complexe în condițiiif
distincte sau imbricate.Împărțirea blocurilor lungi de cod ajută de fapt la localizarea originii erorilor de sintaxă.
Comentați codul incriminat.
În calitate de nou-venit, evitați unele dintre construcțiile sintactice confuze.
? :
poate compacta codul și este într-adevăr util. Dar nu ajută la lizibilitate în toate cazurile. Preferați declarațiileif
simple în timp ce nu sunteți versat.if:
/elseif:
/endif;
) este obișnuită pentru șabloane, dar se poate spune că este mai puțin ușor de urmărit decât blocurile normale{
cod}
.Cele mai răspândite greșeli ale începătorilor sunt:
;
pentru terminarea instrucțiunilor/liniei."
sau'
și ghilimele necompletate în interiorul lor..
.(
paranteze)
. Numărați-le în linia raportată. Există un număr egal de ele?Nu uitați că rezolvarea unei probleme de sintaxă o poate descoperi pe următoarea.
Restaurați o copie de rezervă a codului care a funcționat anterior, dacă nu puteți rezolva problema.
diff
al versiunii defecte și al ultimei versiuni de lucru. Ceea ce ar putea fi lămuritor pentru a afla care este problema de sintaxă.Caractere Unicode rătăcite invizibile: În unele cazuri, trebuie să folosiți un hexeditor sau un alt editor/vizualizator pe sursa dvs. Unele probleme nu pot fi găsite doar uitându-vă la codul dvs.
grep --color -P -n "\[\x80-\xFF\]" file.php
ca primă măsură pentru a găsi simboluri non-ASCII.Aveți grijă la ce tip de întreruperi de linie sunt salvate în fișiere.
//
sau#
pe o singură linie. Comentariile cu mai multe linii/*...*/
deranjează rareori parserul atunci când sunt ignorate întreruperile de linie.În cazul în care erorile de sintaxă nu se transmit pe web: Se întâmplă să aveți o eroare de sintaxă pe calculatorul dumneavoastră. Dar postarea aceluiași fișier pe internet nu o mai prezintă. Ceea ce nu poate însemna decât unul din două lucruri:
Verificați versiunea PHP. Nu toate construcțiile sintactice sunt disponibile pe fiecare server.
php -v
pentru interpretorul de linie de comandă<?php phpinfo();
pentru cel invocat prin intermediul serverului web.Acestea nu sunt'neapărat identice. În special atunci când lucrați cu framework-uri, le veți face să se potrivească.
Nu folosiți cuvintele cheie rezervate din PHP ca identificatori pentru funcții/metode, clase sau constante.
Încercarea și eroarea este ultima ta soluție. Dacă toate celelalte eșuează, puteți oricând să google mesajul de eroare. Simbolurile de sintaxă nu sunt la fel de ușor de căutat (totuși, Stack Overflow însuși este indexat de SymbolHound). Prin urmare, este posibil să fie nevoie să căutați prin mai multe pagini înainte de a găsi ceva relevant. Alte ghiduri:
PHP Debugging Basics de David Sklar
Repararea erorilor PHP de Jason McCreary
Erori PHP - 10 greșeli comune de Mario Lurig
Erori PHP comune și soluții
Cum să depanați și să vă reparați site-ul WordPress
Un ghid al mesajelor de eroare PHP pentru designeri - Smashing Magazine
Ecranul alb al morții
Dacă site-ul dvs. este pur și simplu alb, atunci, de obicei, cauza este o eroare de sintaxă. Activați afișarea acestora cu: - Afișează-le cu:
error_reporting = E_ALL
display_errors = 1
Înphp.ini
dumneavoastră, în general, sau prin.htaccess
pentru mod_php, sau chiar în.user.ini
pentru configurațiile FastCGI. Activarea acestuia în cadrul scriptului stricat este prea târziu, deoarece PHP nu poate nici măcar să interpreteze/execute prima linie. O soluție rapidă este crearea unui script wrapper, să zicemtest.php
:Apoi, apelați codul care nu funcționează prin accesarea acestui script de tip wrapper. De asemenea, este util să activați
error_log
al PHP's și să vă uitați înerror.log
al webserver'serror.log
atunci când un script se blochează cu răspunsuri HTTP 500.Neașteptat T_VARIABLE
Un "unexpected
T_VARIABLE
" înseamnă că există un nume literal$variable
, care nu se potrivește în structura expresiei/extrasului curent.Semicolon lipsă
Cel mai frecvent indică un punct și virgulă lipsă în linia anterioară. Atribuțiile variabilelor care urmează după o declarație sunt un bun indicator unde trebuie căutat:
Concatenare de șiruri
O greșeală frecventă sunt concatenările de șiruri cu operatorul
.
uitat:Btw, ar trebui să preferați string interpolation (variabile de bază între ghilimele duble) ori de câte ori acest lucru ajută la lizibilitate. Ceea ce evită aceste probleme de sintaxă.
Operatori de expresie lipsă
Desigur, aceeași problemă poate apărea și în alte expresii, de exemplu în cazul operațiilor aritmetice:
PHP nu poate gândi aici dacă variabila ar fi trebuit să fie adăugată, scăzută sau comparată etc.
Lists
Același lucru pentru listele de sintaxă, ca în populațiile de array-uri, unde parserul indică și o virgulă așteptată
,
, de exemplu:Sau liste de parametri de funcții:
Echivalent vedeți acest lucru cu instrucțiuni
list
sauglobal
, sau atunci când lipsește un punct și virgulă;
într-o buclăfor
.Declarații de clasă
Această eroare de parser apare, de asemenea, în declarațiile de clasă. Puteți atribui doar constante statice, nu și expresii. Astfel, parserul se plânge de variabile ca date alocate:
În mod special, acoladele de închidere
}
nepotrivite pot duce aici. Dacă o metodă este terminată prea devreme (folosiți indentarea corespunzătoare!), atunci o variabilă rătăcită este de obicei plasată greșit în corpul declarației clasei.Variabile după identificatori
De asemenea, nu puteți avea niciodată o variabilă după un identificator direct:
Btw, acesta este un exemplu obișnuit în care intenția a fost de a folosi variabile variabile poate. În acest caz, o căutare a proprietății variabilei cu
$this->{"myFunc$VAR"}();
, de exemplu.Paranteze lipsă după construcțiile de limbaj
Tastarea precipitată poate duce la uitarea parantezelor de deschidere pentru instrucțiunile
if
șifor
șiforeach
:Soluție: adăugați
(
de deschidere lipsă între declarație și variabilă.Else nu așteaptă condiții
Soluție: Eliminați condițiile din
else
sau utilizațielseif
.Aveți nevoie de paranteze pentru închidere
Soluție: Adăugați paranteze în jurul lui
$var
.Spațiu alb invizibil
După cum s-a menționat în răspunsul de referință privind "Unicode invizibil rătăcit" (cum ar fi un spațiu fără întrerupere), este posibil să vedeți această eroare și pentru coduri nesuspectaculoase de genul
Este destul de răspândit la începutul fișierelor și pentru codul copiat și lipit. Verificați cu un hexeditor, dacă vizual codul dumneavoastră nu pare să conțină o problemă de sintaxă.
A se vedea, de asemenea
Unexpected T_STRING
T_STRING
este o denumire puțin greșită. Acesta nu se referă la un"șir de caractere"
. Înseamnă că a fost întâlnit un identificator brut. Acesta poate varia de la cuvintebare
la resturi deCONSTANT
sau nume de funcții, șiruri de caractere uitate și necotate, sau orice text simplu.Șiruri necotate
Această eroare de sintaxă este însă cea mai frecventă pentru valorile de șiruri de caractere greșit citate. Orice ghilimele `"` sau `'` necompletate și rătăcite vor forma o expresie invalidă: ⇓ ⇓ echo "click aici"; Evidențierea sintaxei va face ca astfel de greșeli să fie super evidente. Este important să nu uitați să folosiți backslashes pentru a scăpa de ghilimelele duble `\"` sau ghilimelele simple `\'` - în funcție de ce a fost folosit ca [string enclosure][1]. - Pentru comoditate, ar trebui să preferați ghilimelele simple exterioare atunci când scoateți HTML simplu cu ghilimele duble în interior. - Utilizați șiruri de caractere cu ghilimele duble dacă doriți să interpolați variabile, dar atunci aveți grijă la scăparea ghilimelelor duble literale `"`. - Pentru ieșiri mai lungi, preferați mai multe linii `echo`/`print` în loc să scăpați înăuntru și afară. Mai bine luați în considerare o secțiune [HEREDOC][2]. A se vedea, de asemenea, *https://stackoverflow.com/questions/3446216/what-is-the-difference-between-single-quoted-and-double-quoted-strings-in-php*.Șiruri de caractere neînchise
Dacă [omiteți o `"` de închidere][3][3], atunci o eroare de sintaxă se materializează de obicei mai târziu. Un șir de caractere neterminat va consuma adesea un pic de cod până la următoarea valoare de șir de caractere prevăzută: ⇓ echo "Some text", $a_variable, "and some runaway string ; success("terminat"); ⇯ Nu este vorba doar de `T_STRING`s literale pe care parserul le poate protesta atunci. O altă variantă frecventă este un [`Unexpected '>'`](https://stackoverflow.com/questions/6507796/troubleshooting-parse-error-unexpected-error) pentru HTML literal necotat.Non-programming string quotes
Dacă *copi și lipești* codul de pe un blog sau de pe un site web, uneori te trezești cu un cod invalid. [Ghilimelele tipografice nu sunt ceea ce așteaptă PHP][4]: $text = 'Ceva ceva ceva..' + "these ain't quotes"; Ghilimelele tipografice/smart sunt simboluri Unicode. PHP le tratează ca parte a textului alfanumeric adiacent. De exemplu `"these` este interpretat ca un identificator constant. Dar orice text literal care urmează este văzut ca un cuvânt gol/T_STRING de către parser.Punct și virgulă lipsă; din nou
Dacă aveți o expresie neterminată în liniile anterioare, atunci orice declarație sau construcție lingvistică următoare este văzută ca un identificator brut: ⇓ func1() func2(); PHP pur și simplu nu-și poate da seama dacă ați vrut să rulați două funcții una după alta, sau dacă ați vrut să le înmulțiți rezultatele, să le adăugați, să le comparați sau să executați doar una `|||` sau cealaltă.Etichete deschise scurte și
Acest lucru este destul de neobișnuit. Dar dacă short_open_tags sunt activate, atunci nu vă puteți începe scripturile PHP [cu o declarație XML][5]: ⇓ <?xml version="1.0"?> PHP va vedea `<?` și îl va revendica pentru el însuși. Nu va'înțelege pentru ce a fost destinat `xml` rătăcit. Va fi interpretat ca fiind o constantă. Dar `version` va fi văzut ca un alt literal/constant. Și din moment ce parserul nu poate înțelege două literale/valori ulterioare fără un operator de expresie între ele, va fi un eșec al parserului.<?xml
anteturi în scripturile PHPCaractere Unicode invizibile
O cauză cea mai hidoasă pentru erorile de sintaxă sunt simbolurile Unicode, cum ar fi [spațiu fără întrerupere][6]. PHP permite caractere Unicode ca nume de identificator. Dacă primiți o reclamație a parserului T_STRING pentru un cod complet nesuspect precum: <?php print 123; trebuie să scoateți un alt editor de text. Sau chiar un hexeditor. Ceea ce pare a fi simple spații și linii noi aici, poate conține constante invizibile. IDE-urile bazate pe Java sunt uneori indiferente la un BOM UTF-8 modificat, la spațiile de lățime zero, la separatoarele de paragraf etc. Încercați să reeditați totul, să eliminați spațiile albe și să adăugați din nou spații normale. Puteți restrânge căutarea prin adăugarea de separatori de declarații `;` redundanți la fiecare început de linie: <?php ;print 123; Punctul și virgula suplimentară `;` de aici va converti caracterul invizibil anterior într-o referință constantă nedefinită (expresie ca declarație). Ceea ce, în schimb, face ca PHP să producă o notificare utilă.Semnul `$` lipsă în fața numelor de variabile
[Variabilele în PHP][7] sunt reprezentate de un semn de dolar urmat de numele variabilei. Semnul dolarului (`$`) este un [sigil][8] care marchează identificatorul ca fiind numele unei variabile. Fără acest sigiliu, identificatorul ar putea fi un [cuvânt cheie de limbaj][9] sau o [constantă][10]. Aceasta este o eroare frecventă atunci când codul PHP a fost ["tradus" din cod scris într-un alt limbaj][11] (C, Java, JavaScript etc.). În astfel de cazuri, o declarație a tipului de variabilă (atunci când codul original a fost scris într-un limbaj care utilizează variabile tipizate) ar putea, de asemenea, să se strecoare și să producă această eroare.Ghilimele scăpate
Dacă folosiți `\` într-un șir de caractere, acesta are o semnificație specială. Acesta se numește "[Caracter de evadare][12]" și în mod normal îi spune parserului să ia caracterul următor la propriu. Exemplu: `echo 'Jim said \'Hello'';`` va imprima `Jim said 'hello'``. Dacă scăpați ghilimelele de închidere ale unui șir de caractere, ghilimelele de închidere vor fi luate literal și nu așa cum au fost intenționate, adică ca ghilimele tipărite ca parte a șirului și nu vor închide șirul. Acest lucru se va afișa ca o eroare de analiză în mod obișnuit după ce deschideți următorul șir sau la sfârșitul scriptului. Eroare foarte frecventă la specificarea căilor de acces în Windows: `"C:\xampp\htdocs\"` este greșit. Aveți nevoie de `"C:\xampp\\\htdocs\\\"`.