PHP parse / syntaks feil; og hvordan løse dem?
Alle støter på syntaksfeil. Selv erfarne programmerere gjør skrivefeil. For nykommere er det bare en del av læringsprosessen. Imidlertid er det ofte lett å tolke feilmeldinger som:
PHP Parse-feil: syntaksfeil, uventet '{' i index.php på linje 20 Det uventede symbolet er ikke alltid den virkelige synderen. Men linjenummeret gir en grov idé om hvor du skal begynne å lete. Se alltid på kodekonteksten. Syntaksfeilen skjuler seg ofte i den nevnte eller i foregående kodelinjer. Sammenlign koden din med syntakseksemplene i håndboken. Selv om ikke alle tilfeller samsvarer med hverandre. Likevel finnes det noen generelle trinn for å løse syntaksfeil. Denne referansen oppsummerer de vanligste fallgruvene:
- Unexpected T_STRING
- Uventet T_VARIABLE
Uventet '$varname' (T_VARIABLE)- Unexpected T_CONSTANT_ENCAPSED_STRING
Unexpected T_ENCAPSED_AND_WHITESPACE- Uventet $slutt
- Unexpected T_FUNCTION...
- Unexpected
{
Unexpected}
Unexpected(
Unexpected)
- Uventet
[
Uventet]
- Unexpected T_IF
Unexpected T_FOREACH
Unexpected T_FOR
Unexpected T_WHILE
Unexpected T_DO
Unexpected T_PRINT
Unexpected T_ECHO- Unexpected T_LNUMBER
- Uventet ?
- Uventet fortsette (T_CONTINUE)
Uventet fortsette (T_BREAK)
Uventet fortsette (T_RETURN)- Uventet '='
- Unexpected T_INLINE_HTML...
- Unexpected T_PAAMAYIM_NEKUDOTAYIM...
- Unexpected T_OBJECT_OPERATOR...
- Unexpected T_DOUBLE_ARROW...
- Uventet T_SL...
- Unexpected T_BOOLEAN_OR...
Unexpected T_BOOLEAN_AND... [Unexpected T_BOOLEAN_AND](https://stackoverflow.com/questions/8668461/unexpected-t-boolean-and-error-in-my-if-statement)..;- Unexpected T_IS_EQUAL
Unexpected T_IS_GREATER_OR_EQUAL
Uventet T_IS_IDENTICAL
Uventet T_IS_NOT_EQUAL
Uventet T_IS_NOT_IDENTICAL
Uventet T_IS_SMALLER_OR_EQUAL
Uventet<
Uventet>
- Uventet T_NS_SEPARATOR...
- Uventet tegn i input: '
\
' (ASCII=92) state=1- Uventet 'public' (T_PUBLIC)
Uventet 'private' (T_PRIVATE)
Uventet 'protected' (T_PROTECTED)
Uventet 'final' (T_FINAL)...- Unexpected T_STATIC...
- Unexpected T_CLASS...
- Unexpected T_DNUMBER
- Unexpected
,
(comma)- Uventet
.
(punktum)- Uventet
;
(semikolon)- Unexpected
*
(asterisk)- Uventet
:
(kolon) Nært beslektede referanser:- Hva betyr denne feilen i PHP? (kjøretidsfeil)
- Parse-feil: syntaksfeil, uventet T_XXX
- Parse-feil: syntaksfeil, uventet T_ENCAPSED_AND_WHITESPACE
- Parse-feil: syntaksfeil, uventet T_VARIABLE
- Hva betyr dette symbolet i PHP? (language tokens)
- Disse
""
smart''
anførselstegnene betyr ingenting for PHP Og:
- PHP-manualen på php.net og dens forskjellige språksymboler
- Eller Wikipedias syntaksintroduksjon om PHP.
- Og til slutt vår php tag-wiki selvfølgelig. Mens Stack Overflow også ønsker nybegynnere velkommen, er det for det meste rettet mot profesjonelle programmeringsspørsmål.
- Å svare på alles kodingsfeil og smale skrivefeil anses for det meste utenfor emnet.
- Så vennligst ta deg tid til å følge de grunnleggende trinnene før du legger ut forespørsler om syntaksfiksering.
Hvis du likevel må, vennligst vis ditt eget løsningsinitiativ, forsøk på rettelser og din tankeprosess om hva som ser ut eller kan være feil. Hvis nettleseren din viser feilmeldinger som "SyntaxError: ulovlig tegn", er det ikke [tag:php]-relatert, men en [tag:javascript]-syntaksfeil.
Syntaksfeil hevet på leverandørkode: Til slutt, vurder at hvis syntaksfeilen ikke ble hevet ved å redigere kodebasen din, men etter en ekstern leverandørpakkeinstallasjon eller oppgradering, kan det skyldes inkompatibilitet med PHP-versjonen, så sjekk leverandørens krav mot plattformoppsettet ditt.
Hva er syntaksfeilene?
PHP tilhører programmeringsspråkene C-stil og imperativ. Det har stive grammatikkregler, som det ikke kan gjenopprette når det støter på feilplasserte symboler eller identifikatorer. Det kan ikke gjette dine kodingsintensjoner. Funksjonsdefinisjon syntaks abstrakt
De viktigste tipsene
Det er noen grunnleggende forholdsregler du alltid kan ta:
Hvordan tolke parserfeil
En typisk syntaksfeilmelding lyder som følger:
{
kodeblokker}
er feil lukket eller nestet, må du kanskje undersøke enda lenger opp i kildekoden. Bruk riktig kodeinnrykk for å forenkle det.+-*/.
bør også være farget forskjellig. Ellers kan de være i feil sammenheng.&"
eller&"
strengmarkør.++
,--
eller parenteser etter en operator. To strenger/identifikatorer direkte etter hverandre er feil i de fleste sammenhenger.if
-setninger i forskjellige eller nestedeif
-betingelser.Partisjonering av lange kodeblokker hjelper virkelig til å finne opprinnelsen til syntaksfeil.
? :
betingelsesoperatoren kan komprimere kode og er faktisk nyttig. Men det hjelper ikke lesbarheten i alle tilfeller. Foretrekker vanligeif
uttalelser mens du ikke er kjent.if:
/elseif:
/endif;
) er vanlig for maler, men uten tvil mindre lett å følge enn vanlige{
kode}
blokker.;
for å avslutte utsagn/linjer."
eller'
og anførselstegn som ikke er omsluttet av anførselstegn..
.(
parenteser)
. Tell dem i den rapporterte linjen. Er det like mange av dem?diff
av den ødelagte og siste fungerende versjonen. Noe som kan være opplysende om hva syntaksproblemet er.grep --color -P -n "\[\x80-\xFF\]" file.php
som det første tiltaket for å finne ikke-ASCII-symboler.//
eller#
kommentarer brukes. Flerlinjers/*...*/
-kommentarer forstyrrer sjelden parseren når linjeskift blir ignorert.php -v
for kommandolinjetolkeren.<?php phpinfo();
for den som påkalles via webserveren. Disse er ikke nødvendigvis de samme. Spesielt når du arbeider med rammeverk, vil du at de skal matche hverandre.Hvit skjerm av død
Hvis nettstedet ditt bare er tomt, er det vanligvis en syntaksfeil som er årsaken. Aktiver visningen med:
error_reporting = E_ALL
(feilrapportering = E_ALL)display_errors = 1
I dinphp.ini
generelt, eller via.htaccess
for mod_php, eller til og med.user.ini
med FastCGI-oppsett. Å aktivere det i det ødelagte skriptet er for sent fordi PHP ikke engang kan tolke / kjøre den første linjen. En rask løsning er å lage et wrapper-skript, for eksempeltest.php
:Påkall deretter den feilende koden ved å få tilgang til dette innpakningsskriptet. Det hjelper også å aktivere PHPs
error_log
og se i webserverenserror.log
når et skript krasjer med HTTP 500-svar.Uventet T_VARIABLE
En "uventet T_VARIABLE" betyr at det finnes et bokstavelig "$variabel"-navn som ikke passer inn i den aktuelle uttrykks-/setningsstrukturen.
(bevisst abstrakt/unøyaktig operator+$variabel-diagram].
Manglende semikolon
Det indikerer oftest et manglende semikolon i forrige linje. Variabeltilordninger etter et utsagn er en god indikator på hvor du skal lete:
String concatenation
Et hyppig uhell er string concatenations med glemt
.
-operator:Forresten, du bør foretrekke string interpolation (grunnleggende variabler i doble anførselstegn) når det hjelper lesbarheten. Som unngår disse syntaksproblemer.
Manglende uttrykksoperatorer
Det samme problemet kan selvfølgelig oppstå i andre uttrykk, for eksempel aritmetiske operasjoner:
PHP kan ikke gjette her om variabelen skal legges til, trekkes fra eller sammenlignes osv.
Lister
Samme for syntakslister, som i array-populasjoner, der parseren også indikerer et forventet komma
,
for eksempel:Eller lister med funksjonsparametere:
Tilsvarende ser du dette med
list
- ellerglobal
-setninger, eller når det mangler et;
semikolon i enfor
-løkke.Klassedeklarasjoner
Denne parserfeilen forekommer også i klassedeklarasjoner. Du kan bare tilordne statiske konstanter, ikke uttrykk. Dermed klager parseren på variabler som tilordnede data:
Uovertruffen
}
avsluttende krøllete klammeparenteser kan spesielt føre til dette. Hvis en metode avsluttes for tidlig (bruk riktig innrykk!), blir en herreløs variabel ofte feilplassert i klassedeklarasjonskroppen.Variabler etter identifikatorer
Du kan heller aldri ha en variabel etter en identifikator direkte:
Btw, dette er et vanlig eksempel der intensjonen var å bruke variable variabler kanskje. I dette tilfellet et variabelegenskapsoppslag med
$this->{"myFunc$VAR"}();
for eksempel.Manglende parens etter språkkonstruksjoner
Forhastet skriving kan føre til at man glemmer åpningsparentesen for
if
ogfor
ogforeach
-setninger:Løsning: legg til den manglende åpningen
(
mellom setning og variabel.Else forventer ikke betingelser
Løsning: Fjern betingelsene fra
else
eller brukelseif
.Trenger parenteser for avslutning
Løsning: Legg til parenteser rundt
$var
.Usynlig mellomrom
Som nevnt i referansesvaret på "Invisible stray Unicode" (for eksempel et non-breaking space), kan du også se denne feilen for intetanende kode som:
Det er ganske utbredt i starten av filer og for kode som er kopiert og limt inn. Sjekk med en hexeditor om koden din ikke ser ut til å inneholde et syntaksproblem.
Se også
Uventet T_STRING
T_STRING
er litt av en misvisende betegnelse. Det refererer ikke til en sitert
"streng"`. Det betyr at en rå identifikator ble funnet. Dette kan være alt fra "nakne" ord til rester av "KONSTANT" eller funksjonsnavn, glemte strenger uten anførselstegn eller ren tekst.Feilsiterte strenger
Denne syntaksfeilen er imidlertid mest vanlig for feilsiterte strengverdier. Enhver unescaped og bortkommen `"` eller `'` sitat vil danne et ugyldig uttrykk: ⇓ ⇓ echo "klikk her"; Syntaksutheving vil gjøre slike feil super åpenbare. Det er viktig å huske å bruke backslashes for å fjerne doble anførselstegn eller enkle anførselstegn - avhengig av hva som ble brukt som [string enclosure][1]. - For enkelhets skyld bør du foretrekke ytre enkle anførselstegn når du skriver ut ren HTML med doble anførselstegn innenfor. - Bruk doble anførselstegn hvis du ønsker å interpolere variabler, men pass da på å unngå bokstavelige doble anførselstegn. - For lengre utdata, foretrekker du flere `echo`/`print`-linjer i stedet for å escape inn og ut. Enda bedre er det å vurdere en [HEREDOC][2]-seksjon. Se også *https://stackoverflow.com/questions/3446216/what-is-the-difference-between-single-quoted-and-double-quoted-strings-in-php*.Uavsluttede strenger
Hvis du [går glipp av et avsluttende `"`][3], oppstår det vanligvis en syntaksfeil senere. En underminert streng vil ofte forbruke litt kode til neste tiltenkte strengverdi: ⇓ echo "Noe tekst", $a_variabel, "og en løpsk streng ; suksess("ferdig"); ⇯ Det er ikke bare bokstavelig `T_STRING` som parseren kan protestere på da. En annen hyppig variant er en [`Uventet '>'`](https://stackoverflow.com/questions/6507796/troubleshooting-parse-error-unexpected-error) for ikke-sitert bokstavelig HTML.Ikke-programmerende anførselstegn
Hvis du *kopierer og limer inn* kode fra en blogg eller et nettsted, ender du noen ganger opp med ugyldig kode. [Typografiske anførselstegn er ikke][4] hva PHP forventer: $text = 'Noe noe ..' + "dette er ikke anførselstegn"; Typografiske/smarte anførselstegn er Unicode-symboler. PHP behandler dem som en del av tilstøtende alfanumerisk tekst. For eksempel tolkes `"these` som en konstant identifikator. Men enhver påfølgende tekst bokstavelig blir da sett på som et bareword/T_STRING av parseren.Det manglende semikolon; igjen
Hvis du har et underminert uttrykk i tidligere linjer, blir enhver påfølgende setning eller språkkonstruksjon sett på som rå identifikator: ⇓ func1() function2(); PHP kan bare ikke vite om du mente å kjøre to funksjoner etter hverandre, eller om du mente å multiplisere resultatene deres, legge dem til, sammenligne dem eller bare kjøre den ene `||` eller den andre.Korte åpne koder og
Dette er ganske uvanlig. Men hvis short_open_tags er aktivert, kan du ikke starte PHP-skriptet [med en XML-erklæring][5]: ⇓ <?xml version="1.0"?> PHP vil se `<?` og gjenvinne det for seg selv. Det vil ikke forstå hva den bortkomne `xml` var ment for. Det vil bli tolket som konstant. Men `versjonen` vil bli sett på som en annen bokstavelig/konstant. Og siden parseren ikke kan gi mening av to påfølgende literaler/verdier uten en uttrykksoperator i mellom, vil det være en parserfeil.<?xml
overskrifter i PHP-skriptUsynlige Unicode-tegn
En mest heslig årsak til syntaksfeil er Unicode-symboler, for eksempel [non-breaking space][6]. PHP tillater Unicode-tegn som identifikatornavn. Hvis du får en T_STRING parser klage for helt uskyldig kode som: <?php skriv ut 123; Du må bryte ut en annen tekstredigerer. Eller en hexeditor til og med. Det som ser ut som vanlige mellomrom og nye linjer her, kan inneholde usynlige konstanter. Java-baserte IDE-er er noen ganger uvitende om en UTF-8 BOM manglet i, nullbredde mellomrom, skilletegn osv. Prøv å redigere alt på nytt, fjern mellomrom og legg til normale mellomrom igjen. Du kan begrense det med å legge til overflødige `;` skilletegn ved hver linjestart: <?php ;print 123; Det ekstra `;` semikolon her vil konvertere det foregående usynlige tegnet til en udefinert konstant referanse (uttrykk som uttalelse). Som til gjengjeld får PHP til å produsere en nyttig melding.Tegnet `$` mangler foran variabelnavn
[Variabler i PHP][7] er representert med et dollartegn etterfulgt av navnet på variabelen. Dollartegnet (`$`) er et [sigil][8] som markerer identifikatoren som et navn på en variabel. Uten dette tegnet kan identifikatoren være et [språknøkkelord][9] eller en [konstant][10]. Dette er en vanlig feil når PHP-koden ble ["oversatt" fra kode skrevet på et annet språk][11] (C, Java, JavaScript osv.). I slike tilfeller kan en deklarasjon av variabeltypen (når den opprinnelige koden ble skrevet i et språk som bruker typede variabler) også snike seg ut og produsere denne feilen.Unnslapp anførselstegn
Hvis du bruker `\` i en streng, har det en spesiell betydning. Dette kalles et "[Escape Character][12]" og forteller normalt parseren å ta det neste tegnet bokstavelig. Eksempel: `echo 'Jim said \'Hello\'';` vil skrive ut `Jim said 'hello'`. Hvis du unngår det avsluttende anførselstegnet i en streng, vil det avsluttende anførselstegnet bli tatt bokstavelig og ikke som tiltenkt, dvs. som et anførselstegn som kan skrives ut som en del av strengen, og ikke avslutte strengen. Dette vises vanligvis som en parsefeil etter at du åpner neste streng eller på slutten av skriptet. Svært vanlig feil når du spesifiserer baner i Windows: `"C:\xampp\htdocs\"` er feil. Du trenger `"C:\\xampp\\htdocs\"`.