PHP-Parse-/Syntax-Fehler; und wie kann man sie lösen?
Jeder stößt auf Syntaxfehler. Selbst erfahrene Programmierer machen Tippfehler. Für Neulinge ist das nur ein Teil des Lernprozesses. Allerdings ist es oft einfach, Fehlermeldungen wie diese zu interpretieren:
PHP Parse-Fehler: Syntaxfehler, unerwartetes '{' in index.php auf Zeile 20 Das unerwartete Symbol ist nicht immer der eigentliche Übeltäter. Aber die Zeilennummer gibt eine ungefähre Vorstellung davon, wo man mit der Suche beginnen sollte. Sehen Sie sich immer den Code-Kontext an. Der Syntaxfehler versteckt sich oft in den erwähnten oder in vorherigen Codezeilen. Vergleichen Sie Ihren Code mit Syntaxbeispielen aus dem Handbuch. Zwar stimmt nicht jeder Fall mit dem anderen überein. Dennoch gibt es einige [allgemeine Schritte zur Lösung von Syntaxfehlern] (https://stackoverflow.com/a/18050072). Diese Referenzen fassen die häufigsten Fallstricke zusammen:
- Unerwarteter T_STRING
- Unerwartetes T_VARIABLE
Unerwartetes '$varname' (T_VARIABLE)- Unerwartete T_CONSTANT_ENCAPSED_STRING
Unerwartete T_ENCAPSED_AND_WHITESPACE- Unerwartetes $end
- Unerwartete T_FUNCTION...
- Unerwartetes
{
Unerwartetes}
Unerwartetes(
Unerwartetes)
- Unerwartetes
[
Unerwartetes]
- Unerwartet T_IF
Unerwartet T_FOREACH
Unerwartet T_FOR
Unerwartet T_WHILE
Unerwartet T_DO
Unerwartet T_PRINT
Unerwartet T_ECHO- Unerwartete T_LNUMBER
- Unerwartetes ?
- Unerwartete Fortsetzung (T_CONTINUE)
Unerwartete Fortsetzung (T_BREAK)
Unerwartete Fortsetzung (T_RETURN)- Unerwartet '='
- Unerwartetes T_INLINE_HTML...
- Unerwartete T_PAAMAYIM_NEKUDOTAYIM...
- Unerwartet T_OBJECT_OPERATOR...
- Unerwartet T_DOUBLE_ARROW...
- Unerwartete T_SL...
- Unerwartete T_BOOLEAN_OR...
Unerwartete T_BOOLEAN_AND...- [Unerwartetes T_IS_EQUAL
Unerwartetes T_IS_GREATER_OR_EQUAL
Unerwartet T_IS_IDENTICAL
Unerwartet T_IS_IDENTICAL <br> Unerwartet T_IS_NOT_EQUAL
Unerwartet T_IS_NOT_EQUAL
Unerwartetes T_IS_NOT_IDENTICAL
Unerwartetes T_IS_SMALLER_OR_EQUAL
Unerwartetes<
Unerwartetes>
- Unerwarteter T_NS_SEPARATOR...
- Unerwartetes Zeichen in der Eingabe: '
\
' (ASCII=92) state=1- Unerwartet 'public' (T_PUBLIC)
Unerwartet 'private' (T_PRIVATE)
Unerwartet 'protected' (T_PROTECTED)
Unerwartet 'final' (T_FINAL)...- Unerwartetes T_STATIC...
- Unerwartete T_CLASS...
- Unerwartete T_DNUMBER
- Unerwartetes
,
(Komma)- Unerwartetes
.
(Punkt)- Unerwartetes
;
(Semikolon)- Unerwartetes
*
(Sternchen)- Unerwartetes
:
(Doppelpunkt) Eng verwandte Referenzen:- Was bedeutet dieser Fehler in PHP? (Laufzeitfehler)
- Parse-Fehler: Syntaxfehler, unerwartetes T_XXX
- Parse-Fehler: Syntaxfehler, unerwartetes T_ENCAPSED_AND_WHITESPACE
- Parse-Fehler: Syntaxfehler, unerwartetes T_VARIABLE
- Was bedeutet dieses Symbol in PHP? (language tokens)
- Diese
""
smarten''
Anführungszeichen bedeuten nichts für PHP Und:
- Das PHP-Handbuch auf php.net und seine verschiedenen language tokens
- Oder Wikipedia's Syntax-Einführung zu PHP.
- Und schließlich natürlich unser php tag-wiki. Obwohl Stack Overflow auch Anfänger willkommen heißt, ist es hauptsächlich auf professionelle Programmierfragen ausgerichtet.
- Das Beantworten von Programmierfehlern und kleinen Tippfehlern wird meist als Off-Topic betrachtet.
- Nehmen Sie sich also bitte die Zeit, die [grundlegenden Schritte] (https://stackoverflow.com/a/18050072) zu befolgen, bevor Sie Anfragen zur Syntaxkorrektur stellen.
Wenn Sie es trotzdem tun müssen, zeigen Sie bitte Ihre eigene Lösungsinitiative, versuchte Korrekturen und Ihren Gedankenprozess darüber, was falsch aussieht oder falsch sein könnte. Wenn Ihr Browser Fehlermeldungen wie "SyntaxError: illegal character" anzeigt, dann ist es eigentlich nicht [tag:php]-bezogen, sondern ein [tag:javascript]-Syntaxfehler.
Syntaxfehler, die durch den Code eines Anbieters ausgelöst wurden: Wenn der Syntaxfehler nicht durch die Bearbeitung Ihrer Codebasis, sondern durch die Installation oder das Upgrade eines externen Anbieterpakets ausgelöst wurde, könnte dies auf eine Inkompatibilität der PHP-Version zurückzuführen sein, überprüfen Sie also die Anforderungen des Anbieters mit Ihrer Plattform.
Was sind die Syntaxfehler?
PHP gehört zu den C-artigen und imperativen Programmiersprachen. Es hat starre Grammatikregeln, von denen es sich nicht erholen kann, wenn es auf falsch platzierte Symbole oder Bezeichner stößt. Sie kann Ihre Kodierungsabsichten nicht erraten.
Wichtigste Tipps
Es gibt ein paar grundlegende Vorsichtsmaßnahmen, die Sie immer treffen können:
Wie man Parser-Fehler interpretiert
Eine typische Syntaxfehlermeldung lautet: Parse error: syntax error, unexpected T_STRING, expecting '
;
' in file.php on line 217 Hier wird der mögliche Ort eines Syntaxfehlers aufgeführt. Siehe den genannten Dateinamen und die Zeilennummer. Ein moniker wieT_STRING
erklärt, welches Symbol der Parser/Tokenizer letztendlich nicht verarbeiten konnte. Dies ist jedoch nicht unbedingt die Ursache für den Syntaxfehler. Es ist wichtig, auch die vorherigen Codezeilen zu untersuchen. Oft handelt es sich bei Syntaxfehlern nur um Pannen, die früher passiert sind. Die Fehlerzeilennummer ist nur die Stelle, an der der Parser endgültig aufgegeben hat, das Ganze zu verarbeiten.Behebung von Syntaxfehlern
Es gibt viele Ansätze, um Syntaxfehler einzugrenzen und zu beheben.
;
Semikolons an den vorhergehenden Zeilenenden/Anweisungen. (Zumindest aus stilistischer Sicht. ){
Codeblöcke}
falsch geschlossen oder verschachtelt sind, müssen Sie vielleicht noch weiter oben im Quellcode nachforschen. Verwenden Sie die richtige Code-Einrückung, um dies zu vereinfachen.+-*/.
sollten ebenfalls unterschiedlich eingefärbt sein. Andernfalls könnten sie im falschen Kontext stehen."
oder'
Zeichenkettenmarkierung gefunden.++
,--
oder Klammern auf einen Operator folgen. Zwei direkt aufeinander folgende Zeichenfolgen/Kennungen sind in den meisten Zusammenhängen nicht korrekt.Das Aufteilen langer Codeblöcke hilft wirklich dabei, den Ursprung von Syntaxfehlern ausfindig zu machen.
? :
Bedingungsoperator kann den Code verdichten und ist in der Tat nützlich. Aber er trägt nicht in allen Fällen zur Lesbarkeit bei. Bevorzugen Sie einfache `if'-Anweisungen, wenn Sie nicht versiert sind.if:
/elseif:
/endif;
) ist für Vorlagen üblich, aber wohl weniger leicht zu verstehen als normale{
Code}
-Blöcke.;
zur Beendigung von Anweisungen/Zeilen."
oder'
und nicht abgeschlossene Anführungszeichen darin..
.(
Klammern)
. Zählen Sie sie in der gemeldeten Zeile. Gibt es eine gleiche Anzahl von ihnen?grep --color -P -n "\[\x80-\xFF\]" file.php
als erste Maßnahme, um Nicht-ASCII-Zeichen zu finden.//
oder#
Kommentare verwendet werden. Mehrzeilige/*...*/
Kommentare stören den Parser nur selten, wenn Zeilenumbrüche ignoriert werden.php -v
für den Kommandozeileninterpreter<?php phpinfo();
für denjenigen, der über den Webserver aufgerufen wird. Das ist aber nicht unbedingt dasselbe. Insbesondere wenn Sie mit Frameworks arbeiten, müssen sie übereinstimmen.Weißer Bildschirm des Todes
Wenn Ihre Website einfach nur leer ist, dann liegt das in der Regel an einem Syntaxfehler. Aktivieren Sie deren Anzeige mit:
error_reporting = E_ALL
php.ini
im Allgemeinen, oder über.htaccess
für mod_php, oder sogar.user.ini
bei FastCGI-Konfigurationen. Das Aktivieren innerhalb des kaputten Skripts ist zu spät, weil PHP nicht einmal die erste Zeile interpretieren/ausführen kann. Ein schneller Workaround ist die Erstellung eines Wrapper-Skripts, z.B.test.php
:Rufen Sie dann den fehlerhaften Code auf, indem Sie auf dieses Wrapper-Skript zugreifen. Es hilft auch, PHP's
error_log
zu aktivieren und einen Blick in Ihr Webserver'serror.log
zu werfen, wenn ein Skript mit HTTP 500 Antworten abstürzt.Unerwartetes T_VARIABLE
Ein "unerwartetes
T_VARIABLE
" bedeutet, dass es einen wörtlichen$variablen
-Namen gibt, der nicht in die aktuelle Ausdrucks-/Anweisungsstruktur passt'.Fehlendes Semikolon
Meistens handelt es sich um [ein fehlendes Semikolon] (https://stackoverflow.com/questions/9135784/syntax-error-unexpected-t-variable) in der vorherigen Zeile. Variablenzuweisungen im Anschluss an eine Anweisung sind ein guter Indikator dafür, wo zu suchen ist:
String-Verkettung
Ein häufiges Missgeschick sind String-Verkettungen mit vergessenem
.
-Operator:Übrigens sollten Sie string interpolation (Basisvariablen in Anführungszeichen) bevorzugen, wenn dies der Lesbarkeit dient. Damit lassen sich diese Syntaxprobleme vermeiden.
Die Interpolation von Zeichenketten ist eine Kernfunktion der Skriptsprache. Es ist keine Schande, sie zu nutzen. Ignorieren Sie alle Ratschläge zur Mikro-Optimierung, dass die Verkettung von Variablen schneller ist. **Das ist es nicht.
Fehlende Ausdrucksoperatoren
Natürlich kann das gleiche Problem auch bei anderen Ausdrücken auftreten, zum Beispiel bei arithmetischen Operationen:
PHP kann hier nicht erraten, ob die Variable addiert, subtrahiert oder verglichen werden soll usw.
Listen
Dasselbe gilt für Syntaxlisten, wie z.B. in Array-Populationen, wo der Parser auch ein erwartetes Komma
,
anzeigt:Oder Funktionen Parameterlisten:
Ähnlich verhält es sich mit
list
oderglobal
Anweisungen, oder wenn ein;
Semikolon in einerfor
Schleife fehlt.Klassendeklarationen
Dieser Parserfehler tritt auch [in Klassendeklarationen] auf (https://stackoverflow.com/questions/5122729/im-getting-a-syntax-error-unexpected-t-variable-error-i-dont-see-what-im). Sie können nur statische Konstanten zuweisen, keine Ausdrücke. Daher beschwert sich der Parser über Variablen als zugewiesene Daten:
Unpassende
}
schließende geschweifte Klammern können hier besonders dazu führen. Wenn eine Methode zu früh beendet wird (korrekte Einrückung!), dann wird häufig eine verirrte Variable in den Körper der Klassendeklaration verlagert.Variablen nach Bezeichnern
Sie können auch niemals eine Variable direkt nach einem Bezeichner einfügen:
Übrigens ist dies ein häufiges Beispiel, bei dem die Absicht war, vielleicht variable Variablen zu verwenden. In diesem Fall eine variable Eigenschaft Lookup mit
$this->{"myFunc$VAR"}();
zum Beispiel.Denken Sie daran, dass die Verwendung von variablen Variablen die Ausnahme sein sollte. Neulinge versuchen oft, sie zu beiläufig zu verwenden, selbst wenn Arrays einfacher und angemessener wären.
Fehlende Parens nach Sprachkonstrukten
Hastiges Tippen kann dazu führen, dass öffnende Klammern vergessen werden für
if
undfor
undforeach
Anweisungen:Lösung: Fügen Sie das fehlende öffnende
(
zwischen Anweisung und Variable ein.Else erwartet keine Bedingungen
Lösung: Entfernen Sie die Bedingungen aus
else
oder verwenden Sieelseif
.Brauche Klammern für den Abschluss
Lösung: Fügen Sie Klammern um
$var
hinzu.Unsichtbarer Whitespace
Wie in der [Referenzantwort] (https://stackoverflow.com/a/18050072/345031) zu "Unsichtbarer Unicode" (wie z.B. ein [non-breaking space] (https://en.wikipedia.org/wiki/Non-breaking_space)) erwähnt, können Sie diesen Fehler auch bei ahnungslosem Code wie dem folgenden sehen:
Es ist ziemlich häufig am Anfang von Dateien und bei kopiertem und eingefügtem Code anzutreffen. Prüfen Sie mit einem Hexeditor, ob Ihr Code nicht visuell ein Syntaxproblem zu enthalten scheint.
Siehe auch
Unerwarteter T_STRING
T_STRING" ist eine etwas missverständliche Bezeichnung. Er bezieht sich nicht auf eine in Anführungszeichen gesetzte "Zeichenkette". Es bedeutet, dass ein roher Bezeichner angetroffen wurde. Dies kann von "bloßen" Wörtern über übrig gebliebene "CONSTANT"- oder Funktionsnamen bis hin zu vergessenen, nicht in Anführungszeichen gesetzten Strings oder einfachem Text reichen.
Falsch zitierte Zeichenketten
Dieser Syntaxfehler tritt jedoch am häufigsten bei falsch zitierten Zeichenfolgen auf. Jedes nicht abgeschlossene und fehlende `"` oder `'` Anführungszeichen bildet einen ungültigen Ausdruck: ⇓ ⇓ echo "click here"; Die Syntaxhervorhebung macht solche Fehler sehr deutlich. Es ist wichtig, daran zu denken, Backslashes zu verwenden, um doppelte Anführungszeichen oder einfache Anführungszeichen zu vermeiden - je nachdem, was als [String Enclosure][1] verwendet wurde. - Der Einfachheit halber sollten Sie bei der Ausgabe von einfachem HTML mit doppelten Anführungszeichen die äußeren einfachen Anführungszeichen bevorzugen. - Verwenden Sie Strings mit doppelten Anführungszeichen, wenn Sie Variablen interpolieren wollen, aber achten Sie dann auf das Escaping von literalen `"` doppelten Anführungszeichen. - Für längere Ausgaben bevorzugen Sie mehrere "echo"/"print"-Zeilen, anstatt "in and out" zu escapen. Noch besser ist es, einen [HEREDOC][2]-Abschnitt zu verwenden. Siehe auch *https://stackoverflow.com/questions/3446216/what-is-the-difference-between-single-quoted-and-double-quoted-strings-in-php*.Ungeschlossene Zeichenketten
Wenn Sie [ein abschließendes `"`][3] vermissen, tritt normalerweise später ein Syntaxfehler auf. Eine nicht abgeschlossene Zeichenkette verbraucht oft ein bisschen Code bis zum nächsten beabsichtigten Zeichenfolgenwert: ⇓ echo "Some text", $a_variable, "and some runaway string ; Erfolg("fertig"); ⇯ Es sind nicht nur wörtliche `T_STRING`s, gegen die der Parser dann protestieren kann. Eine weitere häufige Variante ist ein [Unerwartetes '>'`](https://stackoverflow.com/questions/6507796/troubleshooting-parse-error-unexpected-error) für unquotiertes literales HTML.Nicht programmierte String-Anführungszeichen
Wenn Sie Code von einem Blog oder einer Website *kopieren und einfügen*, erhalten Sie manchmal ungültigen Code. [Typografische Anführungszeichen sind nicht das, was PHP erwartet[4]: $text = 'Irgendwas irgendwas...' + "das sind keine Anführungszeichen"; Typografische/kluge Anführungszeichen sind Unicode-Symbole. PHP behandelt sie als Teil des angrenzenden alphanumerischen Textes. Zum Beispiel wird `"these` als konstanter Bezeichner interpretiert. Aber jedes nachfolgende Textliteral wird dann vom Parser als ein Bareword/T_STRING angesehen.Das fehlende Semikolon; wieder
Wenn Sie einen unterminierten Ausdruck in den vorherigen Zeilen haben, wird jede folgende Anweisung oder Sprachkonstruktion als roher Bezeichner angesehen: ⇓ func1() function2(); PHP kann einfach nicht wissen, ob Sie zwei Funktionen nacheinander ausführen wollen, oder ob Sie deren Ergebnisse multiplizieren, addieren, vergleichen oder nur die eine oder die andere Funktion ausführen wollen.Kurze offene Tags und
Dies ist eher unüblich. Aber wenn short_open_tags aktiviert ist, können Sie Ihre PHP-Skripte nicht [mit einer XML-Deklaration][5] beginnen: ⇓ <?xml version="1.0"?> PHP wird das `<?` erkennen und für sich beanspruchen. Es wird nicht verstehen, wofür das fehlende `xml` gedacht war. Es wird als Konstante interpretiert. Aber die `version` wird als ein weiteres Literal/Konstante angesehen. Und da der Parser keinen Sinn aus zwei aufeinanderfolgenden Literalen/Werten ohne einen Ausdrucksoperator dazwischen machen kann, ist das ein Parserfehler.<?xml
Kopfzeilen in PHP-SkriptenUnsichtbare Unicode-Zeichen
Eine besonders hässliche Ursache für Syntaxfehler sind Unicode-Zeichen, wie z. B. das [non-breaking space][6]. PHP erlaubt Unicode-Zeichen als Bezeichnernamen. Wenn Sie eine T_STRING-Parser-Beschwerde für völlig unverdächtigen Code wie: <?php erhalten, drucken Sie 123; müssen Sie einen anderen Texteditor hervorholen. Oder sogar einen Hexeditor. Was hier wie einfache Leerzeichen und Zeilenumbrüche aussieht, kann unsichtbare Konstanten enthalten. Java-basierte IDEs bemerken manchmal nicht, dass ein UTF-8 BOM in den Text eingearbeitet ist, Leerzeichen mit Null-Breite, Absatztrenner, usw. Versuchen Sie, alles neu zu bearbeiten, Leerzeichen zu entfernen und normale Leerzeichen wieder einzufügen. Sie können das Problem eingrenzen, indem Sie überflüssige `;`-Anweisungstrennzeichen an jedem Zeilenanfang hinzufügen: <?php ;print 123; Das zusätzliche `;` Semikolon wandelt das vorangehende unsichtbare Zeichen in einen undefinierten konstanten Verweis um (Ausdruck als Anweisung). Das wiederum bringt PHP dazu, einen hilfreichen Hinweis zu produzieren.Das fehlende `$` Zeichen vor Variablennamen
[Variablen in PHP][7] werden durch ein Dollarzeichen gefolgt vom Variablennamen dargestellt. Das Dollarzeichen (`$`) ist ein [Siegel][8], das den Bezeichner als Namen einer Variablen kennzeichnet. Ohne dieses Zeichen könnte der Bezeichner ein [Sprachschlüsselwort][9] oder eine [Konstante][10] sein. Dieser Fehler tritt häufig auf, wenn der PHP-Code aus einer anderen Sprache ["übersetzt" wurde][11] (C, Java, JavaScript, etc.). In solchen Fällen kann sich auch eine Deklaration des Variablentyps (wenn der ursprüngliche Code in einer Sprache geschrieben wurde, die typisierte Variablen verwendet) herausschleichen und diesen Fehler verursachen.Entgangene Anführungszeichen
Wenn Sie `\` in einer Zeichenkette verwenden, hat dies eine besondere Bedeutung. Dies wird als "[Escape-Zeichen][12]" bezeichnet und weist den Parser normalerweise an, das nächste Zeichen wörtlich zu nehmen. Beispiel: "echo 'Jim sagte \'Hallo\'';` gibt `Jim sagte 'hallo'` aus. Wenn Sie das schließende Anführungszeichen einer Zeichenkette escapen, wird das schließende Anführungszeichen wörtlich genommen und nicht wie beabsichtigt, d.h. als druckbares Anführungszeichen als Teil der Zeichenkette und nicht als Abschluss der Zeichenkette. Dies wird als Parse-Fehler nach dem Öffnen des nächsten Strings oder am Ende des Skripts angezeigt. Ein sehr häufiger Fehler bei der Angabe von Pfaden in Windows: "C:xampp" ist falsch. Sie brauchen `"C:\xampp\htdocs\"`.