PHP parse/syntax fouten; en hoe ze op te lossen?
Iedereen loopt tegen syntax fouten aan. Zelfs ervaren programmeurs maken tikfouten. Voor nieuwkomers, het's gewoon een deel van het leerproces. Echter, het'is vaak gemakkelijk om foutmeldingen te interpreteren zoals:
PHP Parse error: syntaxfout, onverwachte '{' in index.php op regel 20 Het onverwachte symbool is'niet altijd de echte boosdoener. Maar het regelnummer geeft een ruw idee van waar te beginnen met zoeken. Kijk altijd naar de code context. De syntaxisfout verbergt zich vaak in de genoemde of in vorige coderegels. Vergelijk uw code met syntax voorbeelden uit de handleiding. Hoewel niet elk geval overeenkomt met het andere. Toch zijn er enkele algemene stappen om syntaxisfouten op te lossen. Deze referenties vatten de veel voorkomende valkuilen samen:
- Onverwachte T_STRING
- Onverwachte T_VARIABLE
Onverwachte '$varname' (T_VARIABLE)- Onverwacht T_CONSTANT_ENCAPSED_STRING
Onverwacht T_ENCAPSED_AND_WHITESPACE- Onverwacht $end
- Onverwachte T_FUNCTION...
- Onverwacht
{
Onverwacht}
Onverwacht(
Onverwacht)
- Onverwacht
[
Onverwacht]
- Onverwachte T_IF
Onverwachte T_FOREACH
Onverwachte T_FOR
Onverwachte T_WHILE
Onverwachte T_DO
Onverwachte T_PRINT
Onverwachte T_ECHO- Onverwacht T_LNUMBER
- Onverwacht ?
- Unexpected continue (T_CONTINUE)
Unexpected continue (T_BREAK)
Unexpected continue (T_RETURN)- Onverwacht '='
- Onverwachte T_INLINE_HTML...
- Onverwachte T_PAAMAYIM_NEKUDOTAYIM...
- Onverwachte T_OBJECT_OPERATOR...
- Onverwacht T_DOUBLE_ARROW...
- Onverwacht T_SL...
- Onverwachte T_BOOLEAN_OR...
Onverwachte T_BOOLEAN_AND...- Onverwachte T_IS_EQUAL
Onverwachte T_IS_GREATER_OR_EQUAL
Onverwachte T_IS_IDENTICAL
Onverwachte T_IS_NOT_EQUAL
Onverwachte T_IS_NOT_IDENTICAL
Onverwachte T_IS_SMALLER_OR_EQUAL
Onverwacht<
Onverwacht>
- Onverwachte T_NS_SEPARATOR...
- Onverwacht teken in invoer: '``' (ASCII=92) state=1
- Onverwacht 'public' (T_PUBLIC)
Onverwacht 'private' (T_PRIVATE)
Onverwacht 'protected' (T_PROTECTED)
Onverwacht 'final' (T_FINAL)...- Onverwacht T_STATISCH...
- Onverwachte T_CLASS...
- Onverwacht T_DNUMBER
- Onverwacht
,
(komma)- Onverwachte
.
(punt)- Onverwachte
;
(puntkomma)- Onverwachte
*
](https://stackoverflow.com/q/32905365/3933332) (sterretje)- Onverwacht
:
(dubbele punt) Nauw verwante referenties:- Wat betekent deze fout in PHP? (runtime errors)
- Parsefout: syntaxfout, onverwachte T_XXX
- Parsefout: syntaxisfout, onverwachte T_ENCAPSED_AND_WHITESPACE
- Parsefout: syntaxisfout, onverwachte T_VARIABLE
- Wat betekent dit symbool in PHP? (taal tokens)
- Die
""
slimme''
aanhalingstekens betekenen niets voor PHP En:
- De PHP handleiding op php.net en zijn verschillende language tokens
- Of Wikipedia's syntax introductie over PHP.
- En als laatste natuurlijk onze php tag-wiki. Hoewel Stack Overflow ook beginnende programmeurs verwelkomt, is het vooral gericht op professionele programmeervragen.
- Het beantwoorden van iedereen's coderingsfouten en kleine typefouten wordt meestal beschouwd als off-topic.
- Dus neem de tijd om de basis stappen te volgen, voordat je syntax fixing verzoeken plaatst.
Als je toch moet, toon dan je eigen oplossingsinitiatief, pogingen tot fixes, en je denkproces over wat er fout lijkt of zou kunnen zijn. Als uw browser foutmeldingen weergeeft zoals "SyntaxError: illegal character", dan is het'eigenlijk niet [tag:php]-gerelateerd, maar een [tag:javascript]-syntax fout.
Syntaxisfouten veroorzaakt door code van de leverancier: Tenslotte, denk eraan dat als de syntaxisfout niet veroorzaakt werd door het bewerken van uw codebase, maar na een installatie of upgrade van een extern pakket van de leverancier, het te wijten zou kunnen zijn aan PHP-versie incompatibiliteit, dus controleer de vereisten van de leverancier tegen uw platform setup.
Wat zijn de syntaxis fouten?
PHP behoort tot de C-stijl en imperatieve programmeertalen. Het heeft starre grammaticaregels, waarvan het zich niet kan herstellen als het op misplaatste symbolen of identificatoren stuit. Het kan je coderingsintenties niet raden. Functiedefinitie syntaxis abstract]3
Belangrijkste tips
Er zijn een paar basis voorzorgsmaatregelen die je altijd kunt nemen:
Gebruik de juiste code-inspringing, of hanteer een verheven coderingsstijl. Leesbaarheid voorkomt onregelmatigheden.
Gebruik een IDE of editor voor PHP met syntax highlighting. Die ook helpen bij het uitbalanceren van haakjes/tussen haakjes.
Lees de taalreferentie en voorbeelden in de handleiding. Twee keer, om enigszins bedreven te raken.
Hoe parser fouten te interpreteren
Een typische syntaxfoutmelding luidt:
Open het genoemde bronbestand. Kijk naar de genoemde code regel.
Regelmatiger is het om ook naar voorgaande regels te kijken.
;
puntkomma's bij de voorgaande regeleinden/statements. (Althans vanuit stilistisch oogpunt. ){
codeblokken}
verkeerd gesloten of genest zijn, moet u misschien nog verder in de broncode zoeken. Gebruik de juiste code-inspringing om dat te vereenvoudigen.Kijk naar de syntax kleurstelling!
+-*/.
moeten ook verschillend gekleurd zijn. Anders zouden ze in de verkeerde context kunnen staan."
of'
string marker gevonden die niet is ge-escaped of ontbreekt.++
,--
, of haakjes na een operator staan. Twee strings/identifiers direct na elkaar zijn onjuist in de meeste contexten.Whitespace is your friend. Volg elke coderingsstijl.
Breek lange lijnen tijdelijk op.
if
statements op in afzonderlijke of genesteif
condities.Het opdelen van lange codeblokken helpt echt om de oorsprong van syntaxfouten te lokaliseren.
Commentarieer overtredende code.
Als nieuwkomer, vermijd enkele van de verwarrende syntax constructies.
? :
conditie-operator kan code compact maken en is inderdaad nuttig. Maar het helpt niet in alle gevallen de leesbaarheid. Geef de voorkeur aan gewoneif
statements als ze niet gebruikt worden.if:
/elseif:
/endif;
) is gebruikelijk voor templates, maar aantoonbaar minder gemakkelijk te volgen dan normale{
code}
blokken.De meest voorkomende fouten van nieuwkomers zijn:
;
voor het beëindigen van statements/regels."
of'
en unescaped quotes daarbinnen..
aaneenschakeling.(
haakjes)
. Tel ze in de gerapporteerde regel. Zijn het er een gelijk aantal?Vergeet niet dat het oplossen van één syntax probleem het volgende kan blootleggen.
Herstel een backup van eerder werkende code, als je'het niet kunt repareren.
diff
bekijken van de kapotte en laatst werkende versie. Wat verhelderend kan zijn over wat het syntax probleem is.Onzichtbare verdwaalde Unicode tekens: In sommige gevallen moet je een hexeditor gebruiken of een andere editor/viewer op je broncode. Sommige problemen kunnen niet gevonden worden door alleen naar de code te kijken.
grep --color -P -n "\[\x80-\xFF]" file.php
als de eerste maatregel om niet-ASCII symbolen te vinden.Let op welk type regeleindes worden opgeslagen in bestanden.
//
of#
commentaar wordt gebruikt. Meerregelig/*...*/
commentaar stoort de parser zelden als regeleindes worden genegeerd.Als uw syntaxfout niet over het web verstuurt: Het komt voor dat je een syntaxfout hebt op je machine. Maar als je datzelfde bestand online zet, treedt die fout niet meer op. Wat maar één van twee dingen kan betekenen:
Controleer uw PHP versie. Niet alle syntax constructies zijn beschikbaar op elke server.
php -v
voor de command line interpreter<?php phpinfo();
voor degene die via de webserver wordt aangeroepen.Die zijn niet noodzakelijkerwijs hetzelfde. Vooral als je met frameworks werkt, zul je ze op elkaar moeten afstemmen.
Gebruik PHP's reserved keywords niet als identifiers voor functies/methodes, klassen of constanten.
Trial-and-error is uw laatste redmiddel. Als al het andere faalt, kunt u altijd uw foutmelding googelen. Syntax-symbolen zijn niet zo gemakkelijk te doorzoeken (Stack Overflow zelf wordt wel geïndexeerd door SymbolHound). Daarom kan het nodig zijn om nog een paar pagina's door te kijken voordat je iets relevants vindt. Verdere gidsen:
PHP Debugging Basics door David Sklar
PHP fouten oplossen]13* door Jason McCreary
PHP fouten - 10 veel voorkomende fouten]14* door Mario Lurig
Veel voorkomende PHP fouten en oplossingen
Hoe kunt u problemen oplossen en uw WordPress website repareren
Een gids voor PHP foutmeldingen voor ontwerpers - Smashing Magazine
Wit scherm van de dood
Als uw website gewoon leeg is, dan is meestal een syntaxisfout de oorzaak. Schakel hun weergave in met:
error_reporting = E_ALL
display_errors = 1
In uwphp.ini
in het algemeen, of via.htaccess
voor mod_php, of zelfs.user.ini
met FastCGI opstellingen. Het inschakelen binnen het gebroken script is te laat omdat PHP't zelfs de eerste regel niet kan interpreteren/uitvoeren. Een snelle workaround is het maken van een wrapper script, zegtest.php
:Roep dan de falende code op door dit wrapper script te openen. Het helpt ook om PHP's
error_log
aan te zetten en in je webserver'serror.log
te kijken wanneer een script crasht met HTTP 500 responses.Onverwachte T_VARIABLE
Een "onverwachte
T_VARIABLE
" betekent dat er'een letterlijke$variabele
naam is, die'niet past in de huidige expressie/statement structuur.Ontbrekende puntkomma
Dit duidt meestal op een ontbrekende puntkomma in de vorige regel. Variabele-toewijzingen na een statement zijn een goede indicator waar te kijken:
String aaneenschakeling
Een veel voorkomende fout zijn string aaneenschakelingen met vergeten
.
operator:Btw, je zou de voorkeur moeten geven aan string interpolation (basis variabelen tussen dubbele aanhalingstekens) wanneer dat de leesbaarheid ten goede komt. Dat vermijdt deze syntax problemen.
String interpolatie is een scripting taal kern functie. Geen schande om het te gebruiken. Negeer elk micro-optimalisatie advies over variabele
.
aaneenschakeling die sneller is. Het's niet.Ontbrekende expressie operatoren
Hetzelfde probleem kan zich natuurlijk ook voordoen bij andere expressies, bijvoorbeeld rekenkundige bewerkingen:
PHP kan hier niet gissen of de variabele moet worden opgeteld, afgetrokken of vergeleken enz.
Lijsten
Idem voor syntax-lijsten, zoals in array-populaties, waar de parser ook een verwachte komma
,
aangeeft bijvoorbeeld:Of functies parameter lijsten:
Vergelijkbaar zie je dit met
list
ofglobal
statements, of bij het ontbreken van een;
puntkomma in eenfor
loop.Klasseverklaringen
Deze parser error komt ook voor in class declarations. Je kunt alleen statische constanten toewijzen, geen expressies. De parser klaagt dus over variabelen als toegewezen gegevens:
Ongeëvenaarde
}
afsluitende accolades kunnen hier in het bijzonder toe leiden. Als een methode te vroeg wordt afgesloten (gebruik de juiste inspringing!), dan wordt een verdwaalde variabele vaak misplaatst in de class declaration body.Variabelen na identifiers
Je kan ook nooit een variabele direct na een identifier laten komen:
Btw, dit is een veelvoorkomend voorbeeld waar het de bedoeling was om variabele variabelen misschien te gebruiken. In dit geval een variabele property lookup met
$this->{"myFunc$VAR"}();
bijvoorbeeld.Ontbrekende parens na taalconstructies
Haastig typen kan leiden tot het vergeten van openende haakjes voor
if
enfor
enforeach
statements:Oplossing: voeg de ontbrekende opening
(
toe tussen statement en variabele.Else verwacht geen condities
Oplossing: Verwijder de voorwaarden uit
else
of gebruikelseif
.Haakjes nodig voor afsluiting
Oplossing: Voeg haakjes toe rond
$var
.Onzichtbare spaties
Zoals vermeld in het referentie-antwoord op "Invisible stray Unicode" (zoals een non-breaking space), kunt u deze fout ook zien bij nietsvermoedende code zoals:
Het komt nogal vaak voor in het begin van bestanden en bij gekopieerde en geplakte code. Controleer met een hexeditor, als uw code visueel geen syntaxisprobleem lijkt te bevatten.
Zie ook
Onverwachte T_STRING
T_STRING
is een beetje een verkeerde benaming. Het verwijst niet naar een geciteerde"string"
. Het betekent dat er een ruwe identifier is aangetroffen. Dit kan variëren vankale
woorden tot overgeblevenCONSTANT
of functienamen, vergeten ongequote strings, of elke willekeurige platte tekst.Verkeerd geciteerde strings
Deze syntax fout komt het meest voor bij verkeerd geciteerde string waarden. Elke niet-escaped en verdwaalde `"` of `'` quote zal een ongeldige expressie vormen: ⇓ ⇓ echo "click here"; Syntax highlighting zal zulke fouten super duidelijk maken. Het is belangrijk om te onthouden om backslashes te gebruiken voor het escapen van dubbele aanhalingstekens, of enkele aanhalingstekens - afhankelijk van welke gebruikt werd als [string enclosure][1]. - Voor het gemak kun je het beste enkele aanhalingstekens gebruiken als je HTML uitvoert met dubbele aanhalingstekens erin. - Gebruik strings met dubbele aanhalingstekens als je variabelen wilt interpoleren, maar pas dan op voor het escapen van letterlijke `"` dubbele aanhalingstekens. - Voor langere uitvoer, geef de voorkeur aan meerdere `echo`/`print` regels in plaats van het escapen van in en uit. Beter nog is om een [HEREDOC][2] sectie te overwegen. Zie ook *https://stackoverflow.com/questions/3446216/what-is-the-difference-between-single-quoted-and-double-quoted-strings-in-php*.Unclosed strings
Als je [een afsluitende `"`][3] mist, dan ontstaat er later typisch een syntax fout. Een string die niet wordt afgesloten zal vaak een beetje code opslokken tot de volgende bedoelde stringwaarde: ⇓ echo "Some text", $a_variable, "and some runaway string ; succes("finished"); ⇯ Het's niet alleen letterlijke `T_STRING`s waartegen de parser dan kan protesteren. Een andere veel voorkomende variant is een [`Unexpected '>'`](https://stackoverflow.com/questions/6507796/troubleshooting-parse-error-unexpected-error) voor unquoted literal HTML.Niet-programmeerbare string quotes
Als je code *kopieert en plakt* van een blog of website, kom je soms uit op ongeldige code. [Typografische aanhalingstekens zijn'niet][4] wat PHP verwacht: $text = 'Iets iets...' + "this ain't quotes"; Typografische/smarte aanhalingstekens zijn Unicode-symbolen. PHP behandelt ze als deel van aangrenzende alfanumerieke tekst. Bijvoorbeeld `"these` wordt geïnterpreteerd als een constante identificator. Maar elke volgende letterlijke tekst wordt dan door de parser gezien als een kaal woord/T_STRING.De ontbrekende puntkomma; alweer
Als je een expressie zonder puntkomma hebt in de vorige regels, dan wordt elk volgend statement of taalconstructie gezien als een ruwe identifier: ⇓ func1() function2(); PHP kan gewoon niet weten of je bedoelde om twee functies na elkaar uit te voeren, of dat je bedoelde om hun resultaten te vermenigvuldigen, op te tellen, te vergelijken, of alleen de ene `||` of de andere uit te voeren.Korte open tags en
Dit is vrij ongewoon. Maar als short_open_tags zijn ingeschakeld, dan kun je'je PHP-scripts niet beginnen [met een XML-declaratie][5]: ⇓ <?xml version="1.0"?> PHP zal de `<?` zien en het voor zichzelf opeisen. Het zal niet begrijpen waar de verdwaalde `xml` voor bedoeld was. Het zal worden geïnterpreteerd als een constante. Maar de `versie` zal worden gezien als een andere letterlijke/constante. En aangezien de parser niets kan begrijpen van twee opeenvolgende letterwoorden/waarden zonder een uitdrukkingsoperator ertussen, zal dat'een parserfout zijn.<?xml
headers in PHP scriptsOnzichtbare Unicode tekens
Een afschuwelijke oorzaak van syntaxfouten zijn Unicode-symbolen, zoals de [non-breaking space][6]. PHP laat Unicode karakters toe als identifier namen. Als u een T_STRING parser klacht krijgt voor geheel onverdachte code zoals: <?php print dan 123; Dan moet je een andere tekst editor tevoorschijn halen. Of zelfs een hexeditor. Wat hier lijkt op gewone spaties en nieuwe regels, kan onzichtbare constanten bevatten. Java-gebaseerde IDE's zijn soms ongevoelig voor een UTF-8 BOM gemangeld binnen, nul-breedte spaties, paragraaf scheidingstekens, enz. Probeer alles opnieuw te bewerken, witruimte te verwijderen en normale spaties weer toe te voegen. Je kunt het beperken door overbodige `;` scheidingstekens toe te voegen aan het begin van elke regel: <?php ;print 123; De extra `;` puntkomma hier zal het voorafgaande onzichtbare karakter omzetten in een ongedefinieerde constante verwijzing (expressie als statement). Wat er op zijn beurt voor zorgt dat PHP een nuttige mededeling produceert.Het `$` teken ontbreekt voor variabelenamen
[Variabelen in PHP][7] worden voorgesteld door een dollarteken gevolgd door de naam van de variabele. Het dollarteken (`$`) is een [sigil][8] die de identifier markeert als een naam van een variabele. Zonder dit teken zou de identifier een [taalsleutelwoord][9] of een [constante][10] kunnen zijn. Dit is een veel voorkomende fout wanneer de PHP-code werd ["vertaald" uit code geschreven in een andere taal][11] (C, Java, JavaScript, enz.). In dergelijke gevallen kan een verklaring van het type variabele (wanneer de originele code werd geschreven in een taal die getypte variabelen gebruikt) er ook tussenuit knijpen en deze fout veroorzaken.Ontsnapte aanhalingstekens
Als je `` gebruikt in een string, heeft dat een speciale betekenis. Dit heet een "[Escape Character][12]" en vertelt de parser normaal gesproken om het volgende karakter letterlijk te nemen. Voorbeeld: `echo 'Jim said #39;Hello'';` zal afdrukken `Jim said 'hello'` Als je de afsluitende quote van een string escape, zal de afsluitende quote letterlijk genomen worden en niet zoals bedoeld, d.w.z. als een afdrukbare quote als deel van de string en niet de string afsluiten. Dit zal verschijnen als een parse-fout, meestal na het openen van de volgende string of aan het einde van het script. Veel voorkomende fout bij het opgeven van paden in Windows: `"C:\xampphtdocs\"` is fout. Je hebt `"C:\xampp\htdocs\"` nodig.