Errori di analisi / sintassi di PHP; e come risolverli


651

Tutti incontrano errori di sintassi. Anche i programmatori esperti fanno errori di battitura. Per i nuovi arrivati, è solo una parte del processo di apprendimento. Tuttavia, è spesso facile interpretare i messaggi di errore come:

PHP Parse error: errore di sintassi, imprevisto '{' in index.php alla riga 20

Il simbolo inaspettato non è sempre il vero colpevole. Ma il numero di riga dà un'idea approssimativa di dove iniziare a cercare.

Guarda sempre il contesto del codice . L'errore di sintassi nasconde spesso nel citato o in righe di codice precedenti . Confronta il tuo codice con gli esempi di sintassi del manuale.

Sebbene non tutti i casi corrispondano all'altro. Tuttavia, ci sono alcuni passaggi generali per risolvere gli errori di sintassi . Questi riferimenti hanno riassunto le insidie ​​comuni:

Riferimenti strettamente correlati:

E:

Anche se Stack Overflow dà il benvenuto anche ai programmatori principianti, si rivolge principalmente a domande di programmazione professionale.

  • Rispondere agli errori di codifica e agli errori di battitura di tutti è considerato per lo più fuori tema.
  • Quindi, prenditi il ​​tempo necessario per seguire i passaggi di base , prima di pubblicare richieste di correzione della sintassi.
  • Se è ancora necessario, si prega di mostrare la propria iniziativa di risoluzione, i tentativi di correzione e il processo di pensiero su ciò che sembra o potrebbe essere sbagliato.

Se il tuo browser visualizza messaggi di errore come "SyntaxError: carattere illegale", in realtà non lo ècorrelati, ma a - errore di sintassi .


Errori di sintassi generati dal codice fornitore: Infine, considera che se l'errore di sintassi non è stato generato modificando la base di codice, ma dopo l'installazione o l'aggiornamento di un pacchetto fornitore esterno, potrebbe essere dovuto all'incompatibilità della versione PHP, quindi controlla i requisiti del fornitore rispetto alla tua piattaforma impostare.


1
Questi dati non sono sufficienti per essere una risposta, ma si potrebbe scrivere un analizzatore con parsekit_compile_string e inserire risposte più amichevoli. Se integrato nel tuo IDE, questo potrebbe essere abbastanza informativo.
Owen Beresford,

4
In questo hai investito molto. Rispetto per quello. È probabilmente molto utile per gli insegnanti imparare a segnalare rapidamente errori o per chi crea IDE o implementa soluzioni rapide. Tuttavia, IDE farà già efficacemente gran parte di questo lavoro per te, come suggerisce @Panique. Inoltre, in molti casi, ricominciare da capo è una buona opzione.
allprog,

1
@ Fred-ii- Penso che la maggior parte delle cause siano simili al T_IF / T_FOREACH / ...blocco. Anche se volevo compilare un riepilogo più personalizzato per domande IF / ELSE / ELSEIF.
mario,

1
@mario Non so come esprimerlo, ma questa domanda e risposta potrebbe essere un po 'riscritta e più strutturata? (commento temporaneo)
Rizier123,

2
Sai, vorrei aver avuto questo elenco quando stavo imparando PHP anni fa. Molto utile, specialmente per i principianti.
Chipster,

Risposte:


291

Quali sono gli errori di sintassi?

PHP appartiene ai linguaggi di programmazione stile C e imperativo . Ha regole grammaticali rigide, dalle quali non può recuperare quando incontra simboli o identificatori fuori posto. Non può indovinare le tue intenzioni di codifica.

Estratto della sintassi della definizione della funzione

I consigli più importanti

Ci sono alcune precauzioni di base che puoi sempre prendere:

  • Utilizzare il rientro del codice corretto o adottare uno stile di codifica elevato. La leggibilità previene le irregolarità.

  • Usa un IDE o un editor per PHP con l' evidenziazione della sintassi . Che aiuta anche con il bilanciamento parentesi / parentesi.

    Previsto: punto e virgola

  • Leggi il riferimento della lingua e gli esempi nel manuale. Due volte, per diventare un po 'competente.

Come interpretare gli errori del parser

Un tipico messaggio di errore di sintassi recita:

Errore di analisi : errore di sintassi, T_STRING imprevisto , in attesa di ' ;' in file.php sulla riga 217

Che elenca la possibile posizione di un errore di sintassi. Vedere il nome del file e il numero di riga indicati .

Un moniker come T_STRINGspiega quale simbolo il parser / tokenizer non è riuscito a elaborare finalmente. Tuttavia, questa non è necessariamente la causa dell'errore di sintassi.

È importante esaminare anche le righe di codice precedenti . Spesso gli errori di sintassi sono solo incidenti verificatisi in precedenza. Il numero della riga di errore è proprio dove il parser ha definitivamente rinunciato per elaborare tutto.

Risoluzione degli errori di sintassi

Esistono molti approcci per restringere e correggere il singhiozzo di sintassi.

  • Apri il file sorgente menzionato. Guarda la riga di codice menzionata .

    • Per stringhe in fuga e operatori fuori posto, di solito è qui che trovi il colpevole.

    • Leggi la riga da sinistra a destra e immagina cosa fa ogni simbolo.

  • Più regolarmente è necessario guardare anche le righe precedenti .

    • In particolare, mancano i ;punti e virgola mancanti alle estremità / istruzione della riga precedente. (Almeno dal punto di vista stilistico.)

    • Se i {blocchi di codice }vengono chiusi o nidificati in modo errato, potrebbe essere necessario esaminare ulteriormente il codice sorgente. Utilizzare il rientro del codice corretto per semplificarlo.

  • Guarda la colorazione della sintassi !

    • Stringhe, variabili e costanti dovrebbero avere tutti colori diversi.

    • Anche gli operatori +-*/.dovrebbero essere distinti. Altrimenti potrebbero trovarsi nel contesto sbagliato.

    • Se vedi che la colorazione delle stringhe si estende troppo o troppo breve, hai trovato una chiusura "o un 'marcatore di stringa senza caratteri di escape o mancanti .

    • Avere due caratteri di punteggiatura dello stesso colore uno accanto all'altro può anche significare problemi. Di solito, gli operatori sono solo se non è ++, --o parentesi che segue un operatore. Due stringhe / identificatori che si susseguono direttamente non sono corretti nella maggior parte dei contesti.

  • Whitespace è tuo amico . Segui qualsiasi stile di codifica.

  • Rompere temporaneamente le lunghe file.

    • È possibile aggiungere liberamente nuove righe tra operatori o costanti e stringhe. Il parser quindi concretizzerà il numero di riga per l'analisi degli errori. Invece di guardare il codice molto lungo, è possibile isolare il simbolo di sintassi mancante o fuori posto.

    • Suddividi ifistruzioni complesse in ifcondizioni distinte o nidificate .

    • Invece di lunghe formule matematiche o catene logiche, utilizzare variabili temporanee per semplificare il codice. (Più leggibile = meno errori.)

    • Aggiungi nuove righe tra:

      1. Il codice che puoi facilmente identificare come corretto,
      2. Le parti di cui non sei sicuro,
      3. E le righe di cui si lamenta il parser.

      Il partizionamento di blocchi di codice lunghi aiuta davvero a individuare l'origine degli errori di sintassi.

  • Commenta il codice offensivo.

    • Se non riesci a isolare l'origine del problema, inizia a commentare (e quindi rimuovere temporaneamente) blocchi di codice.

    • Non appena ti sei liberato dell'errore di analisi, hai trovato l'origine del problema. Guarda più da vicino lì.

    • A volte si desidera rimuovere temporaneamente blocchi funzione / metodo completi. (In caso di parentesi graffe senza pari e codice indentato erroneamente.)

    • Quando non è possibile risolvere il problema di sintassi, provare a riscrivere da zero le sezioni commentate .

  • Come nuovo arrivato, evita alcuni dei costrutti di sintassi confusi.

    • L' ? :operatore della condizione ternaria può compattare il codice ed è davvero utile. Ma non aiuta la leggibilità in tutti i casi. Preferisci le ifdichiarazioni semplici mentre non sei sorpreso.

    • La sintassi alternativa di PHP ( if:/ elseif:/ endif;) è comune per i template, ma probabilmente meno facile da seguire rispetto ai normali blocchi di {codice }.

  • Gli errori più recenti per i nuovi arrivati ​​sono:

    • Punto ;e virgola mancanti per terminare istruzioni / righe.

    • Citazioni di stringa non corrispondenti per "o 'e virgolette senza caratteri di escape all'interno.

    • Operatori dimenticati, in particolare per la .concatenazione di stringhe .

    • (Parentesi non bilanciate ). Contali nella riga segnalata. Ne esiste un numero uguale?

  • Non dimenticare che risolvere un problema di sintassi può scoprire il successivo.

    • Se risolvi un problema, ma altri si presentano in alcuni dei codici seguenti, sei per lo più sulla strada giusta.

    • Se dopo aver modificato un nuovo errore di sintassi compare nella stessa riga, è possibile che il tentativo di modifica sia stato un errore. (Non sempre però.)

  • Ripristina un backup di codice precedentemente funzionante, se non è possibile risolverlo.

    • Adottare un sistema di controllo delle versioni del codice sorgente. Puoi sempre visualizzare una diffdelle versioni non funzionanti e l'ultima versione funzionante. Quale potrebbe essere illuminante su quale sia il problema di sintassi.
  • Caratteri Unicode vaganti invisibili : in alcuni casi, è necessario utilizzare un hexeditor o un editor / visualizzatore diverso sulla propria fonte. Alcuni problemi non possono essere trovati semplicemente guardando il tuo codice.

    • Prova grep --color -P -n "\[\x80-\xFF\]" file.phpcome prima misura per trovare simboli non ASCII.

    • In particolare le distinte base, gli spazi a larghezza zero o gli spazi non interrompibili e le virgolette intelligenti possono trovare la loro strada nel codice sorgente.

  • Fai attenzione al tipo di interruzioni di riga salvate nei file.

    • PHP onora solo le \nnuove linee, non i \rritorni a capo .

    • Che a volte è un problema per gli utenti MacOS (anche su OS X per editor non configurati correttamente).

    • Spesso si presenta solo come un problema quando si utilizzano una riga singola //o #commenti. I /*...*/commenti su più righe raramente disturbano il parser quando le interruzioni di riga vengono ignorate.

  • Se l' errore di sintassi non viene trasmesso sul Web : è possibile che si sia verificato un errore di sintassi sul computer. Ma pubblicare lo stesso file online non lo mostra più. Che può significare solo una delle due cose:

    • Stai guardando il file sbagliato!

    • Oppure il tuo codice conteneva un Unicode randagio invisibile (vedi sopra). Puoi scoprirlo facilmente: copia semplicemente il tuo codice dal modulo web nel tuo editor di testo.

  • Controlla la tua versione di PHP . Non tutti i costrutti di sintassi sono disponibili su tutti i server.

    • php -v per l'interprete della riga di comando

    • <?php phpinfo(); per quello invocato tramite il server web.


    Quelli non sono necessariamente gli stessi. In particolare quando si lavora con i framework, si faranno combaciare.

  • Non utilizzare le parole chiave riservate di PHP come identificatori per funzioni / metodi, classi o costanti.

  • Prova ed errore è la tua ultima risorsa.

Se tutto il resto fallisce, puoi sempre google il tuo messaggio di errore. I simboli di sintassi non sono così facili da cercare (Stack Overflow stesso è indicizzato da SymbolHound ). Pertanto, potrebbe essere necessario sfogliare alcune pagine in più prima di trovare qualcosa di rilevante.

Altre guide:

Schermo bianco della morte

Se il tuo sito Web è vuoto, in genere la causa è un errore di sintassi. Abilita il loro display con:

  • error_reporting = E_ALL
  • display_errors = 1

Nel tuo php.inigeneralmente, o via .htaccessper mod_php, o anche.user.ini con configurazioni FastCGI.

L'abilitazione all'interno dello script non funzionante è troppo tardi perché PHP non può nemmeno interpretare / eseguire la prima riga. Una soluzione rapida è la creazione di uno script wrapper, ad esempio test.php:

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

Quindi invocare il codice in errore accedendo a questo script wrapper.

Aiuta anche ad abilitare PHP error_loge esaminare il tuo server weberror.log quando uno script si arresta in modo anomalo con le risposte HTTP 500.


error_reporting(E_ALL | E_STRICT);per le versioni precedenti di PHP
Geo,

2
Alcuni IDE (come NetBeans) supportano non solo l'evidenziazione della sintassi ma anche la formattazione del codice. Se hai l'abitudine di formattare correttamente il tuo codice e chiedere all'IDE di riformattarsi di tanto in tanto, potresti riscontrare problemi difficili da individuare come parentesi graffe senza pari.
Josep Valls,

115

Penso che questo argomento sia totalmente discusso / complicato. L'uso di un IDE è IL modo per evitare completamente eventuali errori di sintassi. Direi persino che lavorare senza un IDE è un po 'poco professionale. Perché? Perché gli IDE moderni controllano la sintassi dopo ogni carattere digitato. Quando si codifica e l'intera riga diventa rossa e un grande avviso mostra il tipo esatto e la posizione esatta dell'errore di sintassi, non è assolutamente necessario cercare un'altra soluzione.

L'uso di un IDE per il controllo della sintassi significa:

In effetti, non incontrerai mai più errori di sintassi, semplicemente perché li vedi nel modo giusto durante la digitazione. Sul serio.

IDE eccellenti con controllo della sintassi (tutti sono disponibili per Linux, Windows e Mac):

  1. NetBeans [gratuito]
  2. PHPStorm [$ 199 USD]
  3. Eclipse con PHP Plugin [gratuito]
  4. Sublime [$ 80 USD] (principalmente un editor di testo, ma espandibile con plugin, come PHP Syntax Parser )

2
É ovvio. Tuttavia, rilasciando gli IDE qui, puoi elaborare un po 'dove differiscono nella loro utilità di sintassi? Sublime è principalmente un editor, non IDE; ma poi più carino e scattante; fa principalmente solo l'evidenziazione della sintassi ma è anche vero per la corrispondenza tra parentesi. Rileva facilmente errori T_CONSTANT_AND_ENCAPSED istantaneamente, ad esempio, a differenza di PHPStorm; che tuttavia fa più linee ondulate per errori in linea. I suggerimenti per la sintassi di NetBeans erano anche più enigmatici dei PHP (rimpiazzando piuttosto i costrutti consentiti). Puoi condividere la tua esperienza su pro / contro; è il tuo Eclipse / PDT preferito o ..?
Mario,

@mario Penso che tu sia molto interessato all'argomento, quindi non voglio davvero dire nulla di sbagliato qui, ma tutto il codice che io (e i miei compagni di squadra, amici che codifichiamo, partner freelance) ho mai scritto in un IDE non è mai stato eseguito con un errore di sintassi. Quindi penso che almeno il controllo della sintassi di Netbeans / PHPStorm sia estremamente potente. Ma forse ho letto male la tua domanda. Dammi qualche ora ...;)
Sliq

La tua risposta è già esatta. Si adatterebbe al 99% delle nostre domande. Tuttavia, per il contesto qui vorrei una considerazione di compromesso su quale IDE fornisse i suggerimenti più intuitivi . Probabilmente è secondario per noi, la colorazione e le linee ondulate sono sufficienti se sei abbastanza esperto. Ma presumo che le differenze potrebbero essere più significative per i principianti.
Mario,

A volte un IDE non è un'opzione fattibile. Ad esempio, apportare modifiche rapide a un tema o plugin di WordPress. Sì, potrei copiare tutto il codice in un IDE, ma poi devo aprirlo, incollarlo tutto lì, impostare le intestazioni e tutto il resto sprecando merda, quando spero solo per una rapida modifica. Ora, se stai sviluppando nuove funzionalità o partendo da zero, allora sì, fallo in un IDE. Non ti pentirai di aver preso un po 'di tempo extra all'inizio per configurarlo.
1934286

Vedo IDE come un trailer, non solo una cassetta degli attrezzi. Potrebbe non essere FIX ma può aiutarti a trovare e prevenire errori di sintassi. Molte risposte qui sembrano dire che se tieni pulito il codice hai meno possibilità di fare un errore e sono più facili da individuare. Bene con rientro automatico, suggerimenti sul codice, occorrenza variabile, parentesi a chiusura automatica e formattazione automatica mi fa risparmiare molti errori di battitura al giorno ed è il principale vantaggio per cui ne uso uno. Questo non conta tutto il resto al di fuori dell'ambito di questa domanda (debugger, connettore del database, diagramma uml ecc.). L'IDE ti farà risparmiare tempo e impedirà molto più che semplici errori di sintassi.
Louis Loudog Trottier,

58

inaspettato [

In questi giorni, la [parentesi imprevista dell'array è comunemente vista su versioni obsolete di PHP. La sintassi dell'array breve è disponibile da PHP > = 5.4 . Supportano solo le installazioni precedenti array().

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

Allo stesso modo, la dereferenziazione dei risultati della funzione array non è disponibile per le versioni precedenti di PHP:

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

Riferimento - Cosa significa questo errore in PHP? - "Errore di sintassi, imprevisto \[" mostra le soluzioni più comuni e pratiche.

Tuttavia, stai sempre meglio solo aggiornando la tua installazione di PHP. Per i piani di web hosting condivisi, prima ricerca se ad esempio SetHandler php56-fcgipuò essere utilizzato per abilitare un runtime più recente.

Guarda anche:

A proposito, ci sono anche pre-processori e down-converter di sintassi PHP 5.4 se sei davvero appiccicoso con versioni PHP precedenti + più lente.

Altre cause per [ errori di sintassi imprevisti

Se non è la mancata corrispondenza della versione di PHP, allora è spesso un errore di battitura o una sintassi per principianti:

  • Non è possibile utilizzare dichiarazioni / espressioni di proprietà dell'array nelle classi , nemmeno in PHP 7.

    protected $var["x"] = "Nope";
                  
  • Confondere [con l'apertura di parentesi graffe {o parentesi graffe (è una svista comune.

    foreach [$a as $b)
            

    O anche:

    function foobar[$a, $b, $c] {
                   
  • O cercando di dereferenziare le costanti (prima di PHP 5.6) come array:

    $var = const[123];
           

    Almeno PHP lo interpreta const come un nome costante.

    Se intendevi accedere a una variabile di matrice (che qui è la causa tipica), aggiungi il $sigillo iniziale, in modo che diventi a$varname .

  • Si sta tentando di utilizzare la globalparola chiave su un membro di un array associativo. Questa non è sintassi valida:

    global $var['key'];


inaspettato ] Staffa quadrata di chiusura

Questo è un po 'più raro, ma ci sono anche incidenti di sintassi con l'array di terminazione ] parentesi .

  • Anche in questo caso sono comuni discrepanze con )parentesi o parentesi }graffe:

    function foobar($a, $b, $c] {
                              
  • O cercando di terminare un array in cui non ce n'è uno:

    $var = 2];

    Ciò si verifica spesso nelle dichiarazioni di array multilinea e nidificate .

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

    In tal caso, utilizzare l'IDE per la corrispondenza delle parentesi quadre per trovare una ]chiusura prematura dell'array. Per lo meno usa più spazio e newline per restringerlo.


Il link 'Down-converter di sintassi PHP 5.4' github.com/IonutBajescu/short-arrays-to-long-arrays sopra è rotto.
Danimal Reks,

46

T_VARIABLE imprevisto

Un "imprevisto T_VARIABLE" significa che esiste un $variablenome letterale , che non si adatta alla struttura dell'espressione / istruzione corrente.

operatore intenzionalmente astratto / inesatto + $ diagramma variabile

  1. Punto e virgola mancante

    Indica più comunemente un punto e virgola mancante nella riga precedente. Le assegnazioni di variabili che seguono un'istruzione sono un buon indicatore dove cercare:

           
    func1()
    $var = 1 + 2;     # parse error in line +2
  2. Concatenazione di stringhe

    Un incidente frequente sono le concatenazioni di stringhe con .operatore dimenticato :

                                   
    print "Here comes the value: "  $value;

    A proposito, dovresti preferire l'interpolazione di stringhe (variabili di base tra virgolette doppie) ogni volta che ciò aiuta la leggibilità. Ciò evita questi problemi di sintassi.

    L'interpolazione di stringhe è una caratteristica fondamentale del linguaggio di scripting . Nessuna vergogna nell'utilizzarlo. Ignora qualsiasi consiglio di microottimizzazione sulla velocità di. concatenazione variabile . Non è.

  3. Operatori di espressioni mancanti

    Naturalmente lo stesso problema può sorgere in altre espressioni, ad esempio operazioni aritmetiche:

               
    print 4 + 7 $var;

    PHP non può indovinare qui se la variabile avrebbe dovuto essere aggiunta, sottratta o confrontata ecc.

  4. elenchi

    Lo stesso vale per gli elenchi di sintassi, come nelle popolazioni di array, in cui il parser indica anche una virgola prevista, ,ad esempio:

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

    O elenchi di parametri di funzioni:

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

    Vedi equivalentemente questo con listo globalistruzioni o quando manca un ;punto e virgola in un forciclo.

  5. Dichiarazioni di classe

    Questo errore del parser si verifica anche nelle dichiarazioni di classe . È possibile assegnare solo costanti statiche, non espressioni. Quindi il parser si lamenta delle variabili come dati assegnati:

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

    Le }parentesi graffe di chiusura senza pari possono in particolare condurre qui. Se un metodo viene terminato troppo presto (utilizzare il rientro corretto!), Una variabile vagante viene comunemente collocata erroneamente nel corpo della dichiarazione di classe.

  6. Variabili dopo identificatori

    Inoltre, non è possibile che una variabile segua direttamente un identificatore :

                 
    $this->myFunc$VAR();

    A proposito, questo è un esempio comune in cui l'intenzione era di usare forse variabili variabili . In questo caso, $this->{"myFunc$VAR"}();ad esempio, una ricerca di proprietà variabile con .

    Tieni presente che l'utilizzo delle variabili variabili dovrebbe essere l'eccezione. I nuovi arrivati ​​spesso provano a usarli in modo troppo casuale, anche quando gli array sarebbero più semplici e più appropriati.

  7. Parentesi mancanti dopo i costrutti del linguaggio

    La digitazione rapida può portare a parentesi aperte o chiuse dimenticate per ife fore foreachdichiarazioni:

           
    foreach $array as $key) {

    Soluzione: aggiungere l'apertura mancante (tra istruzione e variabile.

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

    La {parentesi graffa non apre il blocco di codice, senza prima chiudere l' ifespressione con la )parentesi chiusa.

  8. Altrimenti non prevede condizioni

         
    else ($var >= 0)

    Soluzione: rimuovere le condizioni elseo utilizzare elseif.

  9. Sono necessarie staffe per la chiusura

         
    function() uses $var {}

    Soluzione: aggiungere parentesi intorno $var.

  10. Spazi bianchi invisibili

    Come menzionato nella risposta di riferimento su "Invisible randagio Unicode" (come uno spazio non-break ), potresti anche vedere questo errore per codice ignaro come:

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

    È piuttosto diffuso all'inizio dei file e per il codice copia e incolla. Verificare con un hexeditor, se il codice non sembra visivamente contenere un problema di sintassi.

Guarda anche


32

T_CONSTANT_ENCAPSED_STRING
imprevisto T_ENCAPSED_AND_WHITESPACE imprevisto

I nomi ingombranti T_CONSTANT_ENCAPSED_STRINGe si T_ENCAPSED_AND_WHITESPACEriferiscono ai letterali citati ."string"

Sono utilizzati in contesti diversi, ma il problema della sintassi è abbastanza simile. T_ENCAPSED ... gli avvisi si verificano in un contesto di stringa tra virgolette doppie, mentre le stringhe T_CONSTANT ... sono spesso fuorviate in semplici espressioni o istruzioni PHP.

  1. Interpolazione variabile errata

    E si presenta più frequentemente per l'interpolazione variabile PHP errata:

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

    La citazione delle chiavi degli array è un must nel contesto di PHP. Ma nelle stringhe tra virgolette doppie (o HEREDOC) questo è un errore. Il parser si lamenta del singolo racchiuso tra virgolette 'string', perché di solito si aspetta un identificatore / chiave letterale lì.

    Più precisamente è valido utilizzare la sintassi semplice in stile PHP2 tra virgolette doppie per riferimenti di array:

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

    Le matrici nidificate o i riferimenti a oggetti più profondi richiedono tuttavia la sintassi complessa dell'espressione della stringa riccia :

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

    In caso di dubbi, questo è generalmente più sicuro da usare. Spesso è anche considerato più leggibile. E IDE migliori usano effettivamente una colorazione della sintassi distinta per questo.

  2. Concatenazione mancante

    Se una stringa segue un'espressione, ma manca di una concatenazione o di un altro operatore, vedrai PHP lamentarsi del valore letterale della stringa:

                           
    print "Hello " . WORLD  " !";

    Sebbene sia ovvio per te e per me, PHP non riesce a indovinare che la stringa doveva essere aggiunta lì.

  3. Allegati citazioni di stringa confuse

    Lo stesso errore di sintassi si verifica quando si confondono i delimitatori di stringa . Una stringa iniziata da una virgoletta singola 'o doppia "termina anche con la stessa.

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

    Quell'esempio è iniziato con virgolette doppie. Ma anche le doppie virgolette erano destinate agli attributi HTML. L'operatore di concatenazione previsto all'interno viene tuttavia interpretato come parte di una seconda stringa tra virgolette singole.

    Suggerimento : imposta l'editor / IDE in modo che utilizzi una colorazione leggermente distinta per stringhe tra virgolette singole e doppie. (Aiuta anche con la logica dell'applicazione a preferire ad esempio stringhe tra virgolette doppie per l'output testuale e stringhe con virgolette singole solo per valori di tipo costante.)

    Questo è un buon esempio in cui non dovresti prima uscire dalle doppie virgolette. Invece usa solo le \"escape appropriate per le virgolette degli attributi HTML:

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

    Sebbene ciò possa anche causare confusione nella sintassi, tutti gli IDE / editor migliori aiutano nuovamente colorando le virgolette con escape in modo diverso.

  4. Citazione di apertura mancante

    Equivalentemente vengono dimenticati aprendo "/ 'citando una ricetta per errori del parser:

                   
     make_url(login', 'open');

    Qui ', 'diventerebbe una stringa letterale dopo una parola nuda, quando ovviamente logindoveva essere un parametro stringa.

  5. Elenchi di array

    Se si perde una ,virgola in un blocco di creazione di array, il parser vedrà due stringhe consecutive:

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

    Nota che l'ultima riga può sempre contenere una virgola aggiuntiva, ma trascurarne una in mezzo è imperdonabile. Che è difficile da scoprire senza evidenziare la sintassi.

  6. Elenchi dei parametri delle funzioni

    La stessa cosa per le chiamate di funzione :

                             
    myfunc(123, "text", "and"  "more")
  7. Corde in fuga

    Una variante comune sono i terminatori di stringhe semplicemente dimenticati:

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

    Qui PHP si lamenta di due letterali a stringa che si susseguono direttamente. Ma la vera causa è ovviamente la stringa precedente non chiusa.

Guarda anche


27

T_STRING imprevisto

T_STRINGè un po 'improprio. Non si riferisce a un citato "string". Significa che è stato rilevato un identificatore non elaborato. Questo può variare da bareparole a CONSTANTnomi rimanenti o di funzioni, stringhe non quotate dimenticate o qualsiasi testo semplice.

  1. Stringhe errate

    Questo errore di sintassi è tuttavia più comune per i valori di stringa non quotati. Qualsiasi senza caratteri di escape e randagi "o 'citazione formerà un'espressione non valida:

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

    L'evidenziazione della sintassi renderà tali errori super evidenti. È importante ricordare di usare le barre rovesciate per sfuggire alle \"virgolette doppie o alle \'virgolette singole, a seconda di quale è stata utilizzata come recinzione di stringhe .

    • Per comodità, dovresti preferire virgolette singole esterne quando produci HTML semplice con virgolette doppie all'interno.
    • Utilizzare stringhe tra virgolette doppie se si desidera interpolare le variabili, ma fare attenzione alle escape tra "virgolette doppie letterali .
    • Per un output più lungo, preferisci più echo/ printlinee invece di uscire e uscire. Meglio ancora considerare una sezione HEREDOC .

    Un altro esempio è l'utilizzo della voce PHP all'interno del codice HTML generato con PHP:

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

    Questo accade se $textè grande con molte righe e lo sviluppatore non vede l'intero valore della variabile PHP e si concentra sul pezzo di codice che si dimentica della sua fonte. L'esempio è qui

    Vedi anche Qual è la differenza tra stringhe a virgoletta singola e doppie tra virgolette in PHP? .

  2. Stringhe non chiuse

    Se si manca una chiusura, in genere si verifica in" seguito un errore di sintassi. Una stringa non terminata consumerà spesso un po 'di codice fino al successivo valore di stringa previsto:

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

    Non è solo letterale T_STRINGche il parser può protestare allora. Un'altra variazione frequente è un Unexpected '>'HTML letterale non quotato.

  3. Citazioni di stringhe non di programmazione

    Se copi e incolli il codice da un blog o da un sito Web, a volte si finisce con un codice non valido. Le citazioni tipografiche non sono quelle che PHP si aspetta:

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

    Le virgolette tipografiche / intelligenti sono simboli Unicode. PHP li tratta come parte del testo alfanumerico adiacente. Ad esempio ”theseviene interpretato come un identificatore costante. Ma qualsiasi testo letterale seguente viene quindi visto come parser / T_STRING dal parser.

  4. Il punto e virgola mancante; ancora

    Se hai un'espressione non terminata nelle righe precedenti, qualsiasi istruzione o costrutto del linguaggio seguente viene visto come identificatore non elaborato:

           
    func1()
    function2();

    PHP non può sapere se intendevi eseguire due funzioni dopo l'altra, o se intendevi moltiplicare i loro risultati, aggiungerli, confrontarli o eseguire solo l'uno ||o l'altro.

  5. Tag aperti brevi e <?xml intestazioni negli script PHP

    Questo è piuttosto raro. Ma se short_open_tags sono abilitati, non puoi iniziare i tuoi script PHP con una dichiarazione XML :

          
    <?xml version="1.0"?>

    PHP vedrà <?e lo rivendicherà da solo. Non capirà a cosa servisse il randagio xml. Verrà interpretato come costante. Ma la versionvolontà sarà vista come un altro letterale / costante. E poiché il parser non può avere senso di due valori / valori letterali successivi senza un operatore di espressione in mezzo, sarà un errore del parser.

  6. Caratteri Unicode invisibili

    Una causa più orribile degli errori di sintassi sono i simboli Unicode, come lo spazio non-break . PHP consente ai caratteri Unicode come nomi identificativi. Se ricevi un reclamo del parser T_STRING per codice completamente insospettabile come:

    <?php
        print 123;

    Devi aprire un altro editor di testo. O anche un hexeditor. Quelli che sembrano spazi semplici e nuove linee qui possono contenere costanti invisibili. Gli IDE basati su Java sono talvolta ignari di una distinta base UTF-8 manipolata all'interno, spazi di larghezza zero, separatori di paragrafi, ecc. Provare a modificare nuovamente tutto, rimuovere gli spazi bianchi e aggiungere nuovamente gli spazi normali.

    Puoi restringerlo con l'aggiunta di ;separatori di istruzioni ridondanti ad ogni inizio di riga:

    <?php
        ;print 123;

    Il ;punto e virgola aggiuntivo qui convertirà il carattere invisibile precedente in un riferimento costante indefinito (espressione come istruzione). Che in cambio rende PHP un avviso utile.

  7. Il segno `$` manca davanti ai nomi delle variabili

    Le variabili in PHP sono rappresentate da un simbolo di dollaro seguito dal nome della variabile.

    Il simbolo del dollaro ( $) è un sigillo che contrassegna l'identificatore come nome di una variabile. Senza questo sigillo, l'identificatore potrebbe essere una parola chiave della lingua o una costante .

    Questo è un errore comune quando il codice PHP è stato "tradotto" dal codice scritto in un'altra lingua (C, Java, JavaScript, ecc.). In tali casi, anche una dichiarazione del tipo di variabile (quando il codice originale è stato scritto in una lingua che utilizza variabili tipizzate) potrebbe anche sgattaiolare fuori e produrre questo errore.

  8. Virgolette scappate

    Se lo usi \in una stringa, ha un significato speciale. Questo si chiama " Escape Character " e normalmente dice al parser di prendere alla lettera il personaggio successivo.

    Esempio: echo 'Jim said \'Hello\'';stamperàJim said 'hello'

    Se si evita la virgoletta di chiusura di una stringa, la virgoletta di chiusura verrà presa alla lettera e non come previsto, ovvero come virgoletta stampabile come parte della stringa e non chiudere la stringa. Questo mostrerà come un errore di analisi 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\"è errato. Hai bisogno "C:\\xampp\\htdocs\\".


18

inaspettato (

Le parentesi aperte in genere seguono costrutti di linguaggio come if/ foreach/ for/ array/ listo iniziano un'espressione aritmetica. Sono sintatticamente errati dopo "strings", un precedente (), un solitario $e in alcuni contesti di dichiarazione tipici.

  1. Parametri della dichiarazione di funzione

    Una ricorrenza più rara per questo errore sta tentando di utilizzare le espressioni come parametri di funzione predefiniti . Questo non è supportato, nemmeno in PHP7:

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

    I parametri in una dichiarazione di funzione possono essere solo valori letterali o espressioni costanti. A differenza delle invocazioni di funzioni, dove è possibile utilizzare liberamente whatever(1+something()*2), ecc.

  2. Valori predefiniti delle proprietà della classe

    Stessa cosa per le dichiarazioni dei membri della classe , in cui sono consentiti solo valori letterali / costanti, non espressioni:

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

    Metti queste cose nel costruttore. Vedi anche Perché gli attributi PHP non consentono le funzioni?

    Notate ancora che PHP 7 consente solo var $xy = 1 + 2 +3;espressioni costanti lì.

  3. Sintassi JavaScript in PHP

    L'uso di JavaScript o della sintassi jQuery non funzionerà in PHP per ovvi motivi:

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

    Quando ciò accade, di solito indica una stringa precedente non terminata; e <script>sezioni letterali che perdono nel contesto del codice PHP.

  4. isset (()), vuoto, chiave, successivo, corrente

    Entrambi isset()e empty()sono incorporati nel linguaggio, non funzioni. Devono accedere direttamente a una variabile . Se inavvertitamente aggiungi troppo una coppia di parentesi, creeresti comunque un'espressione:

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

    Lo stesso vale per qualsiasi costrutto linguistico che richiede l'accesso implicito al nome della variabile. Questi built-in fanno parte della grammatica della lingua, quindi non consentono parentesi extra decorative.

    Le funzioni a livello di utente che richiedono un riferimento variabile, ma ottengono un risultato di espressione superato, portano invece a errori di runtime.


inaspettato )

  1. Parametro di funzione assente

    Non è possibile avere le virgole vaganti per ultime in una chiamata di funzione . PHP si aspetta un valore lì e quindi si lamenta di una )parentesi a chiusura anticipata .

                  
    callfunc(1, 2, );

    Una virgola finale è consentita array()o list()costruita solo.

  2. Espressioni non finite

    Se dimentichi qualcosa in un'espressione aritmetica, il parser si arrende. Perché come dovrebbe eventualmente interpretare che:

                   
    $var = 2 * (1 + );

    E se dimenticassi anche la chiusura ), riceveresti invece un reclamo sul punto e virgola imprevisto.

  3. Foreach as constant

    Per i prefissi variabili dimenticati $nelle istruzioni di controllo vedrai:

                           
    foreach ($array as wrong) {

    PHP qui a volte ti dice che invece era previsto ::. Perché una variabile class :: $ potrebbe aver soddisfatto l'espressione $ variabile prevista.


inaspettato {

Parentesi graffe {e }blocchi di codice racchiusi. E gli errori di sintassi su di loro di solito indicano un annidamento errato.

  1. Sottoespressioni senza pari in un if

    Più comunemente sbilanciato (e) sono la causa se il parser si lamenta dell'apertura del riccio che {appare troppo presto. Un semplice esempio:

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

    Conta le parentesi o usa un IDE che ti aiuta. Inoltre, non scrivere codice senza spazi. La leggibilità conta.

  2. {e} nel contesto dell'espressione

    Non puoi usare le parentesi graffe nelle espressioni. Se confondi le parentesi e i curlys, non sarà conforme alla grammatica della lingua:

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

    Esistono alcune eccezioni per la costruzione dell'identificatore, come la variabile di ambito locale ${references}.

  3. Variabili variabili o espressioni var ricci

    Questo è piuttosto raro. Ma potresti anche ottenere {e }analizzare reclami per espressioni variabili complesse:

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

    Sebbene ci sia una maggiore probabilità di un imprevisto }in tali contesti.


inaspettato }

Quando si riceve un }errore "imprevisto ", per lo più hai chiuso un blocco di codice troppo presto.

  1. Ultima istruzione in un blocco di codice

    Può succedere per qualsiasi espressione non terminata.

    E se l'ultima riga in un blocco funzione / codice manca di un ;punto e virgola finale :

    function whatever() {
        doStuff()
    }            

    Qui il parser non può dire se forse vuoi ancora aggiungere + 25;al risultato della funzione o qualcos'altro.

  2. Nesting del blocco non valido / dimenticato {

    A volte vedrai questo errore del parser quando un blocco di codice è stato }chiuso troppo presto o hai dimenticato {anche l' apertura :

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

    Nello snippet sopra ifnon {c'erano parentesi graffe aperte . Così quello di chiusura }sotto divenne ridondante. E quindi la chiusura successiva }, che era prevista per la funzione, non era associabile alla {parentesi graffa di apertura originale .

    Tali errori sono ancora più difficili da trovare senza un rientro corretto del codice. Utilizzare un IDE e una corrispondenza parentesi.


Inaspettato {, in attesa(

I costrutti del linguaggio che richiedono un'intestazione condizione / dichiarazione e un blocco di codice attiveranno questo errore.

  1. Elenchi di parametri

    Ad esempio, le funzioni dichiarate erroneamente senza l'elenco dei parametri non sono consentite:

                     
    function whatever {
    }
  2. Condizioni della dichiarazione di controllo

    E allo stesso modo non puoi avere un ifsenza condizioni .

      
    if {
    }

    Il che non ha senso, ovviamente. La stessa cosa per i soliti sospetti, for/ foreach, while/ do, ecc.

    Se hai questo errore particolare, dovresti assolutamente cercare alcuni esempi manuali.


1
Stavo cercando la risposta alla mia domanda in questo post, ma ho trovato la risposta al problema di "Inaspettato {", ecco perché volevo condividere con la mia risposta - per me il problema era la codifica di interruzione di riga - in qualche modo alcuni dei miei i file utilizzavano le interruzioni di riga di macintosh, ma quando le ho cambiate in interruzioni di riga di Windows - il mio problema (su localhost (WAMP) tutto funziona, ma su webserver linux non è stato risolto).
Edgars Aivars,

@EdgarsAivars Grazie per il tuo commento! Le interruzioni di riga specifiche della piattaforma sono in effetti un problema insolito e complicato. Probabilmente lo citerò anche qui. (È stato appena menzionato a parte nell'altra risposta di riferimento .)
mario

Ho scoperto che ottenere Unexpected} era perché un pezzo del mio codice utilizzava il tag breve php <? invece di <? php - mi ci è voluto un po 'per trovarlo mentre funzionava su altri server.
c7borg,

14

$ End imprevisto

Quando PHP parla di un "imprevisto $end", significa che il tuo codice è terminato prematuramente. (Il messaggio è un po 'fuorviante se preso alla lettera. Non si tratta di una variabile denominata "$ end", come talvolta viene assunta dai nuovi arrivati. Si riferisce alla "fine del file",. EOF)

Causa: non bilanciata {e }per blocchi di codice / e dichiarazioni di funzioni o classi.

E ' quasi sempre di un mancante }parentesi graffa per chiudere blocchi di codice precedente.

  • Ancora una volta, utilizzare il rientro corretto per evitare tali problemi.

  • Utilizzare un IDE con abbinamento parentesi, per scoprire dove si }trova. Esistono scorciatoie da tastiera nella maggior parte degli IDE e degli editor di testo:

    • NetBeans, PhpStorm, Komodo: Ctrl[eCtrl]
    • Eclipse, Aptana: CtrlShiftP
    • Atom, Sublime: Ctrlm- Zend StudioCtrlM
    • Geany, Notepad ++: CtrlB- Joe: CtrlG- Emacs: C-M-n- Vim:%

La maggior parte degli IDE evidenzia anche parentesi graffe, parentesi e parentesi corrispondenti. Il che rende abbastanza facile ispezionare la loro correlazione:

Corrispondenza parentesi in un IDE

Espressioni non terminate

E l' Unexpected $enderrore di sintassi / parser può verificarsi anche per espressioni o istruzioni non terminate:

  • $var = func(1, ?>EOF

Quindi, guarda prima la fine degli script. Un trailing ;è spesso ridondante per l'ultima istruzione in qualsiasi script PHP. Ma dovresti averne uno. Proprio perché restringe tali problemi di sintassi.

Marcatori HEREDOC rientrati

Un'altra occorrenza comune appare con le stringhe HEREDOC o NOWDOC . Il marcatore finale viene ignorato con spazi iniziali, schede, ecc .:

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

Pertanto, il parser presuppone che la stringa HEREDOC continui fino alla fine del file (quindi "Inaspettato $ end"). Praticamente tutti gli IDE e gli editor per l'evidenziazione della sintassi lo renderanno ovvio o lo avvertiranno.

Virgolette scappate

Se lo usi \in una stringa, ha un significato speciale. Questo si chiama " Escape Character " e normalmente dice al parser di prendere alla lettera il personaggio successivo.

Esempio: echo 'Jim said \'Hello\'';stamperàJim said 'hello'

Se si evita la virgoletta di chiusura di una stringa, la virgoletta di chiusura verrà presa alla lettera e non come previsto, ovvero come virgoletta stampabile come parte della stringa e non chiudere la stringa. Questo mostrerà come un errore di analisi 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\"è errato. Hai bisogno "C:\\xampp\\htdocs\\".

Sintassi alternativa

Un po 'più raro è possibile vedere questo errore di sintassi quando si utilizza la sintassi alternativa per blocchi di istruzioni / codice nei modelli. Usando if:e else:e un mancante endif;per esempio.

Guarda anche:


14

T_IF
imprevisto T_ELSEIF
imprevisto T_ELSE
imprevisto T_ENDIF imprevisto

Blocchi di controllo condizionali if, elseife elseseguono una struttura semplice. Quando si riscontra un errore di sintassi, è molto probabile che sia solo un annidamento a blocchi non valido → con {parentesi graffe mancanti }- o uno in eccesso.

inserisci qui la descrizione dell'immagine

  1. Manca {o }dovuta a rientro errato

    Le parentesi graffe di codice non corrispondenti sono comuni al codice meno formattato come:

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

    Se il tuo codice è simile al seguente, ricominciare da capo! Altrimenti non è riparabile per te o per chiunque altro. Non ha senso mostrarlo su Internet per chiedere aiuto.

    Sarai in grado di risolverlo solo se puoi seguire visivamente la struttura nidificata e la relazione dei condizionali if / else e dei loro {blocchi di codice }. Usa il tuo IDE per vedere se sono tutti abbinati.

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

    Qualsiasi doppio } }non chiuderà solo un ramo, ma una struttura di condizioni precedente. Quindi attenersi a uno stile di codifica; non mescolare e abbinare in alberi nidificati if / else.

    A parte la coerenza qui, risulta utile evitare anche condizioni prolungate. Utilizzare variabili o funzioni temporanee per evitare ifespressioni illeggibili .

  2. IF non può essere usato nelle espressioni

    Un errore sorprendentemente frequente per i nuovi arrivati ​​sta cercando di utilizzare ifun'istruzione in un'espressione, come un'istruzione print:

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

    Che ovviamente non è valido.

    È possibile utilizzare un condizionale ternario , ma attenzione agli impatti della leggibilità.

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

    In caso contrario, rompere tali costrutti uscita Up: Usa multipla ifs e echos .
    Meglio ancora, usa le variabili temporanee e posiziona i tuoi condizionali prima di:

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

    Anche la definizione di funzioni o metodi per tali casi ha spesso senso.

    I blocchi di controllo non restituiscono "risultati"

    Ora questo è meno comune, ma alcuni programmatori provano persino a trattare ifcome se potesse restituire un risultato :

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

    Che è strutturalmente identico all'utilizzo ifall'interno di una concatenazione / espressione di stringhe.

    • Ma le strutture di controllo (if / foreach / while) non hanno un "risultato" .
    • La stringa letterale "vero" sarebbe anche solo un'istruzione nulla.

    Dovrai utilizzare un compito nel blocco di codice :

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

    In alternativa, ricorrere a un ?:confronto ternario.

    If in If

    Non è possibile nidificareif all'interno di una condizione:

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

    Il che è ovviamente ridondante, poiché il and(o or) consente già il concatenamento di confronti.

  3. ;Punto e virgola dimenticato

    Ancora una volta: ogni blocco di controllo deve essere un'istruzione. Se il pezzo di codice precedente non è terminato da un punto e virgola, si tratta di un errore di sintassi garantito:

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

    A proposito, anche l'ultima riga di un {…}blocco di codice richiede un punto e virgola.

  4. Punto e virgola troppo presto

    Ora è probabilmente sbagliato dare la colpa a un particolare stile di codifica, poiché questa trappola è troppo facile da trascurare:

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

    Il che succede più spesso di quanto tu possa immaginare.

    • Quando si termina l' if ()espressione con; essa, verrà eseguita un'istruzione void. Il ;diventa un vuoto a {}sé stante!
    • Il {…}blocco quindi è staccato da if, e funzionerebbe sempre.
    • Quindi il elsenon aveva più una relazione con un ifcostrutto aperto , motivo per cui ciò avrebbe portato a un errore di sintassi T_ELSE imprevisto.

    Il che spiega anche una variazione altrettanto sottile di questo errore di sintassi:

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

    Dove il ;dopo il blocco di codice {…}termina l'intero if costrutto, tagliando il elseramo in modo sintattico.

  5. Non si utilizzano blocchi di codice

    È sintatticamente permesso omettere parentesi graffe {... }per blocchi di codice in if/ elseif/else branch. Che purtroppo è uno stile di sintassi molto comune ai programmatori non convertiti. (Con il falso presupposto questo è stato più veloce da digitare o leggere).

    Tuttavia, è molto probabile che si verifichi la sintassi. Prima o poi le dichiarazioni aggiuntive troveranno la loro strada nei rami if / else:

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

    Ma in realtà usare i blocchi di codice, è c'è bisogno di scrivere {... }come tali!

    Anche i programmatori esperti evitano questa sintassi senza bretelle, o almeno la comprendono come un'eccezione eccezionale alla regola.

  6. Else / Elseif nell'ordine sbagliato

    Una cosa da ricordare è l' ordine condizionale , ovviamente.

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

    Puoi avere quanti elseifs vuoi, ma elsedeve andare per ultimo . È così.

  7. Dichiarazioni di classe

    Come accennato in precedenza , non è possibile avere istruzioni di controllo in una dichiarazione di classe:

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

    O hai dimenticato una definizione di funzione o chiusa }troppo presto in questi casi.

  8. T_ELSEIF / T_ELSE imprevisto

    Quando si mescolano PHP e HTML, la chiusura }di un if/elseifdeve essere nello stesso blocco PHP <?php ?>del successivo elseif/else. Ciò genererà un errore poiché la chiusura }delle ifesigenze deve far parte di elseif:

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

    La forma corretta <?php } elseif:

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

    Questa è più o meno una variazione di rientro errato, presumibilmente spesso basato su intenzioni di codifica errate.
    Non si può schiacciare altre dichiarazioni inbetween if e elseif/ elsegettoni strutturali:

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

    Entrambi possono verificarsi solo in {…}blocchi di codice, non tra i token della struttura di controllo.

    • Questo non avrebbe comunque senso. Non è che ci sia stato uno stato "indefinito" quando PHP salta tra ife i elserami.
    • Dovrai decidere dove appartengono le dichiarazioni di stampa / o se devono essere ripetute in entrambi i rami.

    Né puoi separare un if / else tra diverse strutture di controllo:

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

    Non esiste una relazione sintattica tra il ife else. L' foreachambito lessicale termina a }, quindi non ha senso che la ifstruttura continui.

  9. T_ENDIF

    Se si lamenta un T_ENDIF imprevisto, si sta utilizzando lo stile di sintassi alternativo if:elseif:else:endif;. Di cui dovresti davvero pensarci due volte.

    • Una trappola comune sta confondendo i due punti stranamente simili :per un ;punto e virgola . (Coperto in "Punto e virgola troppo presto")

    • Poiché il rientro è più difficile da tracciare nei file modello, tanto più quando si utilizza la sintassi alternativa: è plausibile endif;che non corrisponda a nessuno if:.

    • L'uso } endif; è un termostato raddoppiato if .

    Mentre un "fine $ inatteso" è di solito il prezzo di un }tutore di chiusura chiuso dimenticato .

  10. Compito vs. confronto

    Quindi, questo non è un errore di sintassi, ma vale la pena ricordare in questo contesto:

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

    Non è un ==/ ===confronto, ma un =compito . Questo è piuttosto sottile e porterà facilmente alcuni utenti a modificare in modo impotente interi blocchi di condizioni. Fai attenzione prima agli incarichi non intenzionali: quando si verifica un errore logico / comportamento errato.


11

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

Gli operatori di confronto, come ==, >=, ===, !=, <>, !==e <=oppure <e >per lo più devono essere utilizzati solo nelle espressioni, come ad esempio ifle espressioni. Se il parser si lamenta di loro, allora spesso significa accoppiamento errato o ( )parentesi non corrispondenti intorno a loro.

  1. Raggruppamento di Parens

    In particolare per le ifdichiarazioni con confronti multipli è necessario fare attenzione a contare correttamente le parentesi di apertura e chiusura :

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

    Qui la ifcondizione qui era già terminata dal)

    Una volta che i tuoi confronti diventano sufficientemente complessi, spesso aiuta a dividerli in ifcostrutti multipli e nidificati .

  2. isset () combinato con il confronto

    Un nuovo arrivato comune è che pitfal sta cercando di combinare isset()o empty()con confronti:

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

    O anche:

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

    Questo non ha senso per PHP, perché issete emptysono costrutti di linguaggio che accettano solo nomi di variabili. Non ha senso nemmeno confrontare il risultato, perché l'output è solo / già un valore booleano.

  3. Confusione >=maggiore o uguale con l' =>operatore di array

    Entrambi gli operatori sembrano in qualche modo simili, quindi a volte si confondono:

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

    Devi solo ricordare che questo operatore di confronto è chiamato " maggiore o uguale " per farlo bene.

    Vedi anche: Se la struttura delle istruzioni in PHP

  4. Niente da confrontare

    Inoltre, non è possibile combinare due confronti se hanno lo stesso nome di variabile:

                     
    if ($xyz > 5 and < 100)

    PHP non può dedurre che intendevi confrontare nuovamente la variabile iniziale. Le espressioni sono di solito accoppiate in base alla precedenza dell'operatore , quindi al momento della <visualizzazione, rimarrebbe solo un risultato booleano dalla variabile originale.

    Vedi anche: imprevisto T_IS_SMALLER_OR_EQUAL

  5. Catene di confronto

    Non è possibile confrontare una variabile con una riga di operatori:

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

    Questo deve essere suddiviso in due confronti, ciascuno contro $x.

    Questo è in realtà più un caso di espressioni nella lista nera (a causa dell'associatività dell'operatore equivalente). È sintatticamente valido in alcuni linguaggi in stile C, ma PHP non lo interpreterebbe nemmeno come catena di confronto prevista.

  6. Inaspettato >
    Inaspettato<

    Il maggiore >o il minore di <operatori non hanno un T_XXXnome tokenizer personalizzato . E mentre possono essere fuori posto come tutti gli altri, più spesso vedi il parser lamentarsi di loro per stringhe citate in modo errato e HTML schiacciato:

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

    Ciò equivale a una stringa che "<a href='z"viene confrontata >con una costante letterale Helloe quindi a un altro <confronto. O almeno così vede PHP. La vera causa e l'errore di sintassi è stata la "terminazione prematura della stringa .

    Inoltre, non è possibile nidificare i tag di avvio PHP:

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

Guarda anche:


11

T_IF
imprevisto T_FOREACH
imprevisto T_FOR
imprevisto T_WHILE
imprevisto T_DO
imprevisto T_ECHO

Controllo costrutti quali if, foreach, for, while, list, global, return, do, print, echopossono essere intese come istruzioni. Di solito risiedono su una linea da soli.

  1. Punto e virgola; dove sei?

    Abbastanza universalmente ti sei perso un punto e virgola nella riga precedente se il parser si lamenta di una dichiarazione di controllo:

                 
    $x = myfunc()
    if (true) {

    Soluzione: esaminare la riga precedente; aggiungi punto e virgola.

  2. Dichiarazioni di classe

    Un'altra posizione in cui ciò si verifica è nelle dichiarazioni di classe . Nella sezione della classe è possibile elencare solo le inizializzazioni delle proprietà e le sezioni del metodo. Nessun codice può risiedere lì.

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

    Tali errori di sintassi si materializzano comunemente per nidificazione errata {e }. In particolare quando i blocchi di codici funzione sono stati chiusi troppo presto.

  3. Dichiarazioni nel contesto di espressione

    La maggior parte dei costrutti del linguaggio può essere utilizzata solo come istruzioni . Non sono pensati per essere inseriti in altre espressioni:

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

    Allo stesso modo non puoi usare un ifin stringhe, espressioni matematiche o altrove:

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

    Per incorporare ifin modo specifico condizioni simili a un'espressione, spesso si desidera utilizzare una ?:valutazione ternaria .

    Lo stesso vale per for, while, global, echoe in misura minore list.

              
    echo 123, echo 567, "huh?";

    Considerando che print()è un linguaggio incorporato che può essere utilizzato nel contesto di espressione. (Ma raramente ha senso.)

  4. Parole chiave riservate come identificatori

    Non è inoltre possibile utilizzare dooe ifaltri costrutti di linguaggio per funzioni definite dall'utente o nomi di classi. (Forse in PHP 7. Ma anche allora non sarebbe consigliabile.)


7

Inatteso "?"

Se stai tentando di utilizzare l'operatore di coalescenza null ??in una versione di PHP precedente a PHP 7, otterrai questo errore.

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

"?" Imprevisto, in attesa di una variabile

Un errore simile può verificarsi per tipi nullable, come in:

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

Che indica nuovamente una versione PHP obsoleta in uso (o la versione CLI php -vo quella associata al server web phpinfo();).


5

T_LNUMBER imprevisto

Il token si T_LNUMBERriferisce a un "lungo" / numero.

  1. Nomi delle variabili non validi

    In PHP e nella maggior parte degli altri linguaggi di programmazione, le variabili non possono iniziare con un numero. Il primo carattere deve essere alfabetico o di sottolineatura.

    $1   // Bad
    $_1  // Good

    *

    • Abbastanza spesso viene fuori per usare preg_replace-placeholder "$1"nel contesto di PHP:

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

      Dove il callback avrebbe dovuto essere citato. (Ora il /eflag regex è stato deprecato. Ma a volte è ancora usato in modo improprio nelle preg_replace_callbackfunzioni.)

    • Lo stesso vincolo identificativo si applica alle proprietà dell'oggetto , tra l'altro.

             
      $json->0->value
    • Mentre il tokenizer / parser non consente un valore letterale $1come nome variabile, è possibile utilizzare ${1}o ${"1"}. Che è una soluzione sintattica per identificatori non standard. (È meglio pensarlo come una ricerca di ambito locale. Ma in generale: preferire array semplici per questi casi!)

    • In modo divertente, ma molto sconsigliato, il parser PHPs consente di identificare gli Unicode; tale $➊sarebbe valido. (A differenza di un letterale 1).

  2. Voce di array smarrito

    Un lungo imprevisto può verificarsi anche per le dichiarazioni di array - quando mancano le ,virgole:

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

    O anche chiamate e dichiarazioni di funzioni e altri costrutti:

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

    Quindi di solito ce n'è uno ;o ,mancante per separare elenchi o espressioni.

  3. HTML errato

    E ancora, le stringhe tra virgolette sono una fonte frequente di numeri vaganti:

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

    Tali casi dovrebbero essere trattati più o meno come errori T_STRING imprevisti .

  4. Altri identificatori

    Né funzioni, classi, né spazi dei nomi possono essere nominati che iniziano con un numero:

             
    function 123shop() {

    Più o meno come per i nomi delle variabili.


2

"=" Imprevisto

Ciò può essere causato dall'avere caratteri non validi in un nome di variabile. I nomi delle variabili devono seguire queste regole:

I nomi delle variabili seguono le stesse regole delle altre etichette in PHP. Un nome di variabile valido inizia con una lettera o un trattino basso, seguito da un numero qualsiasi di lettere, numeri o caratteri di sottolineatura. Come espressione regolare, sarebbe espresso così: '[a-zA-Z_ \ x7f- \ xff] [a-zA-Z0-9_ \ x7f- \ xff] *'


Buona aggiunta Giovanni.
Funk Forty Niner

1

"Continua" imprevisto (T_CONTINUE)

continueè una dichiarazione (come per o se) e deve apparire autonoma. Non può essere usato come parte di un'espressione. In parte perché continue non restituisce un valore, ma in un'espressione ogni sottoespressione deve comportare un valore in modo che l'espressione complessiva dia luogo a un valore. Questa è la differenza tra un'affermazione e un'espressione.

Ciò significa che continuenon può essere utilizzato in un'istruzione ternaria o in qualsiasi istruzione che richiede un valore di ritorno.

"Pausa" imprevista (T_BREAK)

Lo stesso vale break;ovviamente. Inoltre, non è utilizzabile nel contesto dell'espressione, ma un'istruzione rigorosa (allo stesso livello di foreacho un ifblocco).

"Ritorno" imprevisto (T_RETURN)

Questo potrebbe essere più sorprendente per return, ma è anche solo un'istruzione a livello di blocco . Restituisce un valore (o NULL) all'ambito / funzione superiore, ma non valuta come espressione stessa. → Cioè: non ha senso farloreturn(return(false);;


1

Inatteso "."

Ciò può verificarsi se stai tentando di utilizzare l' operatore splat ( ...) in una versione non supportata di PHP.

... è diventato per la prima volta disponibile in PHP 5.6 per acquisire un numero variabile di argomenti in una funzione:

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

In PHP 7.4, puoi usarlo per le espressioni di array .

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

0

"Endwhile" imprevisto (T_ENDWHILE)

La sintassi sta usando i due punti - se non ci sono due punti, si verificherà l'errore sopra riportato.

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

L'alternativa a questa sintassi sta usando le parentesi graffe:

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

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


0

Un messaggio di errore che inizia Parse error: syntax error, unexpected ':'può essere causato scrivendo erroneamente un riferimento statico di classe Class::$Variablecome Class:$Variable.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.