Errori di analisi/sintassi di PHP; e come risolverli?
Tutti si imbattono in errori di sintassi. Anche i programmatori esperti fanno errori di battitura. Per i nuovi arrivati, è solo parte del processo di apprendimento. Tuttavia, è spesso facile interpretare i messaggi di errore come: PHP Parse error: syntax error, unexpected '{' in index.php sulla linea 20 Il simbolo inatteso non è sempre il vero colpevole. Ma il numero di linea dà un'idea approssimativa di dove iniziare a cercare. Guardate sempre il contesto del codice. L'errore di sintassi spesso si nasconde nel citato o in linee di codice precedenti. Confrontate il vostro codice con gli esempi di sintassi del manuale. Anche se non tutti i casi corrispondono agli altri. Tuttavia ci sono alcuni passi generali per risolvere gli errori di sintassi. Questi riferimenti hanno riassunto le insidie comuni:
- T_STRING inatteso
- Unexpected T_VARIABLE
Unexpected '$varname' (T_VARIABLE) - T_CONSTANT_ENCAPSED_STRING
Unexpected T_ENCAPSED_AND_WHITESPACE - Inatteso $end
- T_FUNCTION inattesa...
- Unexpected
{
Unexpected}``<br>Unexpected
(<br>Unexpected
)` - [Inatteso
[
Inatteso]
]](https://stackoverflow.com/a/29505827) - T_IF inatteso
T_FOREACH inatteso
T_FOR inatteso
T_WHILE inatteso
T_DO inatteso
T_PRINT inatteso
T_ECHO inatteso - T_LNUMBER inatteso
- Inatteso ?
- Continua inatteso (T_CONTINUE)
Continua inatteso (T_BREAK)
Continua inatteso (T_RETURN) - Unexpected '='
- T_INLINE_HTML inatteso...
- T_PAAMAYIM_NEKUDOTAYIM...
- T_OBJECT_OPERATOR inatteso...
- T_DOUBLE_ARROW inatteso...
- T_SL inaspettato...
- T_BOOLEAN_OR inatteso...
Unexpected T_BOOLEAN_AND... - Unexpected T_IS_EQUAL
Unexpected T_IS_GREATER_OR_EQUAL
Inatteso T_IS_IDENTICAL
T_IS_NOT_EQUAL inatteso Inatteso T_IS_NOT_IDENTICAL
Inatteso T_IS_SMALLER_OR_EQUAL
Inatteso<
Unexpected>
- T_NS_SEPARATOR inatteso...
- Carattere inatteso in input: '
\
' (ASCII=92) state=1 - Unexpected 'public' (T_PUBLIC)
Unexpected 'private' (T_PRIVATE)
Unexpected 'protected' (T_PROTECTED)
Unexpected 'final' (T_FINAL)... - T_STATIC inatteso...
- T_CLASSE inattesa...
- T_DNUMBER inatteso
- Inatteso
,
(virgola) - Unpexected
.
(punto) - Unnexpected
;
(punto e virgola) - Inatteso
*
(asterisco) - Inatteso
:
(due punti) Riferimenti strettamente correlati: - Cosa significa questo errore in PHP? (errori di runtime)
- Cosa significa questo simbolo in PHP? (token del linguaggio)
- Quelle
""
intelligenti''
virgolette non significano nulla in PHP E:
- Il manuale PHP su php.net e i suoi vari token di linguaggio
- Oppure Wikipedia introduzione alla sintassi di PHP.
- E infine il nostro php tag-wiki naturalmente. Sebbene Stack Overflow accolga anche codificatori principianti, è principalmente rivolto a domande di programmazione professionale.
- Rispondere agli errori di codifica e agli errori di battitura di tutti è considerato per lo più off-topic.
- Quindi per favore prenditi il tempo di seguire i passi base, prima di postare richieste di correzione della sintassi.
-
Se devi ancora farlo, per favore mostra la tua iniziativa risolutiva, le correzioni tentate, e il tuo processo di pensiero su ciò che sembra o potrebbe essere sbagliato. Se il vostro browser visualizza messaggi di errore come "SyntaxError: illegal character", allora non è effettivamente legato al [tag:php], ma ad un [tag:javascript]-errore di sintassi.
Errori di sintassi generati dal codice del fornitore: Infine, considerate che se l'errore di sintassi non è stato generato modificando la vostra base di codice, ma dopo l'installazione o l'aggiornamento di un pacchetto di un fornitore esterno, potrebbe essere dovuto all'incompatibilità della versione di PHP, quindi controllate i requisiti del fornitore rispetto alla configurazione della vostra piattaforma.
Quali sono gli errori di sintassi?
PHP appartiene ai linguaggi di programmazione stile C e imperativo. Ha regole grammaticali rigide, dalle quali non può riprendersi quando incontra simboli o identificatori fuori posto. Non può indovinare le vostre intenzioni di codifica.
Consigli più importanti
Ci sono alcune precauzioni di base che puoi sempre prendere:
Come interpretare gli errori del parser
Un tipico messaggio di errore di sintassi recita: Parse error: syntax error, unexpected T_STRING, expecting '
;
' in file.php on line 217 Che elenca la possibile posizione di un errore di sintassi. Vedi il nome del file e il numero della linea menzionati. Un moniker comeT_STRING
spiega quale simbolo il parser/tokenizer non ha potuto elaborare alla fine. Questa non è necessariamente la causa dell'errore di sintassi, tuttavia. E' importante guardare anche le linee di codice precedenti. Spesso gli errori di sintassi sono solo contrattempi accaduti in precedenza. Il numero della linea di errore è solo il punto in cui il parser ha definitivamente rinunciato ad elaborare il tutto.Risolvere gli errori di sintassi
Ci sono molti approcci per restringere e risolvere gli errori di sintassi.
;
alla fine della linea/stato precedente. (Almeno dal punto di vista stilistico. ){
}` sono chiusi o annidati in modo scorretto, potresti aver bisogno di indagare ancora più in alto nel codice sorgente. Usa una corretta indentazione del codice per semplificare la cosa.+-*/.
dovrebbero essere colorati separatamente. Altrimenti potrebbero essere nel contesto sbagliato."
o'
di chiusura mancante.++
,--
, o parentesi che seguono un operatore. Due stringhe/identificatori che si seguono direttamente sono scorretti nella maggior parte dei contesti.if
in condizioniif
distinte o annidate.? :
può compattare il codice ed è davvero utile. Ma non aiuta la leggibilità in tutti i casi. Preferite le semplici dichiarazioniif
quando non sono state superate.if:
/elseif:
/endif;
) è comune per i template, ma probabilmente meno facile da seguire dei normali blocchi di{
codice}
.;
per terminare le dichiarazioni/linee."
o'
e virgolette non catturate all'interno..
.(
parentesi)
. Contatele nella riga riportata. Ce ne sono un numero uguale?diff
della versione rotta e dell'ultima versione funzionante. Il che potrebbe essere illuminante su quale sia il problema di sintassi. br/>grep --color -P -n "\x80-\xFF\]" file.php
]9 come prima misura per trovare simboli non-ASCII.//
o#
. I commenti multilinea/*...*/
raramente disturbano il parser quando le interruzioni di riga vengono ignorate.php -v
per l'interprete della linea di comando<?php phpinfo();
per quello invocato attraverso il webserver. Questi non sono necessariamente la stessa cosa. In particolare quando si lavora con i framework, li si vuole far combaciare.Schermo bianco della morte
Se il tuo sito web è semplicemente vuoto, allora tipicamente la causa è un errore di sintassi. Abilita la loro visualizzazione con:
error_reporting = E_ALL
display_errors = 1 Nel tuo [
php.ini][18] in generale, o tramite [
.htaccess][19] per mod_php, o anche [
.user.ini][20] con le configurazioni FastCGI. Abilitarlo all'interno dello script rotto è troppo tardi perché PHP non può nemmeno interpretare/eseguire la prima linea. Un rapido workaround è creare uno script wrapper, diciamo
test.php`:Quindi invocare il codice che fallisce accedendo a questo script wrapper. Aiuta anche ad abilitare il
error_log
di PHP e guardare nel tuo webserver'serror.log
quando uno script va in crash con risposte HTTP 500.T_VARIABILE inattesa
Un "unexpected
T_VARIABLE
" significa che c'è un nome letterale di$variabile
, che non si adatta alla struttura dell'espressione/stato corrente.Punto e virgola mancante
Indica più comunemente un punto e virgola mancante nella riga precedente. Le assegnazioni di variabili che seguono una dichiarazione sono un buon indicatore di dove guardare:
concatenazione di stringhe
Un errore frequente sono le concatenazioni di stringhe con l'operatore
.
dimenticato:Btw, dovresti preferire interpolazione di stringhe (variabili di base tra virgolette doppie) quando ciò aiuta la leggibilità. Il che evita questi problemi di sintassi.
L'interpolazione delle stringhe è una caratteristica fondamentale del linguaggio di scrittura. Nessuna vergogna nell'utilizzarla. Ignorate qualsiasi consiglio di micro-ottimizzazione sulla concatenazione delle variabili
.
che è più veloce. **Non lo è.Operatori di espressione mancanti
Naturalmente lo stesso problema può sorgere in altre espressioni, per esempio le operazioni aritmetiche:
PHP non può indovinare qui se la variabile deve essere aggiunta, sottratta o confrontata, ecc.
Liste
/h3>
Lo stesso per le liste sintattiche, come nelle popolazioni di array, dove il parser indica anche una virgola attesa
,
per esempio:O elenchi di parametri di funzioni:
Equivalentemente lo vedete con dichiarazioni
list
oglobal
, o quando manca un;
punto e virgola in un ciclofor
.Dichiarazioni di classe
Questo errore del parser si verifica anche nelle dichiarazioni di classe. Si possono assegnare solo costanti statiche, non espressioni. Così il parser si lamenta delle variabili come dati assegnati:
Le parentesi graffe di chiusura non appaiate
}
possono in particolare portare qui. Se un metodo è terminato troppo presto (usate una corretta indentazione!), allora una variabile vagante è comunemente collocata in modo errato nel corpo della dichiarazione di classe.Variabili dopo gli identificatori
Non potete mai avere una variabile dopo un identificatore direttamente:
Btw, questo è un esempio comune in cui l'intenzione era di usare variabili variabili forse. In questo caso una ricerca di proprietà variabili con
$this->{"myFunc$VAR"}();
per esempio.Tieni a mente che l'uso delle variabili dovrebbe essere l'eccezione. I nuovi arrivati spesso cercano di usarle con troppa disinvoltura, anche quando gli array sarebbero più semplici e appropriati.
Parentesi mancanti dopo i costrutti del linguaggio
Una digitazione frettolosa può portare a dimenticare le parentesi di apertura per le dichiarazioni
if
efor
eforeach
:Soluzione: aggiungi l'apertura mancante
(
tra l'istruzione e la variabile.Else non prevede condizioni
Soluzione: Rimuovi le condizioni da
else
o usaelseif
.Servono parentesi per la chiusura
Soluzione: Aggiungi le parentesi attorno a
$var
.Spazi bianchi invisibili
Come menzionato nella risposta di riferimento su "Invisible stray Unicode" (come un non-breaking space), potresti anche vedere questo errore per codice ignaro come:
È piuttosto prevalente all'inizio dei file e per il codice copiato e incollato. Controllate con un hexeditor, se il vostro codice non sembra visivamente contenere un problema di sintassi.
Vedi anche
T_STRING inaspettato
T_STRING
è un po' un termine improprio. Non si riferisce a una"stringa"
quotata. Significa che è stato incontrato un identificatore grezzo. Questo può spaziare da parolebare
ad avanzi diCONSTANT
o nomi di funzioni, stringhe dimenticate non quotate, o qualsiasi testo semplice./h3> Questo errore di sintassi è più comune per valori di stringhe mal citate. Qualsiasi citazione senza escape e randagio- Per comodità dovresti preferire le virgolette singole esterne quando emetti del semplice HTML con le doppie virgolette all'interno.
- Usa le stringhe con doppi apici se vuoi interpolare le variabili, ma poi fai attenzione all'escaping dei doppi apici letterali
- Per un output più lungo, preferisci più linee
"
o'
formerà un'espressione non valida: ⇓ ⇓ echo "clicca qui"; L'evidenziazione della sintassi renderà questi errori super ovvi. E' importante ricordare di usare le backslashes per l'escape delle "doppie virgolette", o delle "virgolette singole" - a seconda di quale sia stato usato come "string enclosure"1."
.echo
/print
invece di usare l'escape in e out. Meglio ancora considerare una sezione HEREDOC. Vedere anche https://stackoverflow.com/questions/3446216/what-is-the-difference-between-single-quoted-and-double-quoted-strings-in-php."
allora un errore di sintassi tipicamente si materializza dopo. Una stringa non terminata spesso consumerà un po' di codice fino al prossimo valore di stringa previsto: ⇓ echo "Qualche testo", $a_variabile, "e qualche stringa non terminata ; successo("finito"); ⇯ Non sono solo leT_STRING
letterali che il parser può protestare. Un'altra variazione frequente è unUnexpected '>'
per HTML letterale non quotato."these
viene interpretato come un identificatore costante. Ma qualsiasi letterale di testo che segue è visto come una bareword/T_STRING dal parser.||
o l'altra.Tag aperti brevi e
Questo è piuttosto raro. Ma se short_open_tags è abilitato, allora non puoi'iniziare i tuoi script PHP [con una dichiarazione XML][5]: ⇓ <?xml version="1.0"?> PHP vedrà il `<?` e lo reclamerà per sé. Non capirà a cosa serve l'"xml" vagante. Verrà interpretato come costante. Ma la `versione` sarà vista come un altro letterale/costante. E poiché il parser non può dare un senso a due valori letterali successivi senza un operatore di espressione in mezzo, questo sarà un fallimento del parser.<?xml
intestazioni negli script PHP;
all'inizio di ogni linea: <?php ;print 123; Il punto e virgola extra qui convertirà il carattere invisibile precedente in un riferimento costante non definito (espressione come dichiarazione). Il che in cambio fa sì che PHP produca un utile avviso.Il segno `$` mancante davanti ai nomi delle variabili
[Le variabili in PHP[7] sono rappresentate da un segno di dollaro seguito dal nome della variabile. Il segno del dollaro (`$`) è un [sigillo][8] che contrassegna l'identificatore come nome di una variabile. Senza questo sigillo, l'identificatore potrebbe essere una [parola chiave della lingua][9] o una [costante][10]. Questo è un errore comune quando il codice PHP è stato ["tradotto" da codice scritto in un altro linguaggio][11] (C, Java, JavaScript, ecc.). In questi casi, una dichiarazione del tipo di variabile (quando il codice originale era scritto in un linguaggio che usa variabili tipizzate) potrebbe anche sgattaiolare via e produrre questo errore./h3> Se usi
quote' in una stringa, ha un significato speciale. Questo è chiamato un "[carattere di escape][12]" e normalmente dice al parser di prendere il carattere successivo alla lettera. Esempio:
echo 'Jim ha detto 'Ciao'';stamperà
Jim ha detto 'ciao'Se si esegue l'escape delle virgolette di chiusura di una stringa, le virgolette di chiusura saranno prese alla lettera e non come previsto, cioè come una citazione stampabile come parte della stringa e non come chiusura della stringa. Questo verrà mostrato come un errore di parsing comunemente dopo aver aperto la stringa successiva o alla fine dello script. Errore molto comune quando si specificano i percorsi in Windows:
"C:xampp\htdocs\"è sbagliato. Hai bisogno di
"C:\xampp\htdocs`"`.