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.
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.
Es gibt ein paar grundlegende Vorsichtsmaßnahmen, die Sie immer treffen können:
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 wie T_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.
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.? :
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.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
:<?php
error_reporting(E_ALL);
ini_set("display_errors", 1);
include("./broken-script.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's error.log
zu werfen, wenn ein Skript mit HTTP 500 Antworten abstürzt.
Ein "unerwartetes T_VARIABLE
" bedeutet, dass es einen wörtlichen $variablen
-Namen gibt, der nicht in die aktuelle Ausdrucks-/Anweisungsstruktur passt'.
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:
⇓
func1()
$var = 1 + 2; # Parse-Fehler in Zeile +2
Ein häufiges Missgeschick sind String-Verkettungen mit vergessenem .
-Operator:
⇓
print "Hier kommt der Wert: " $wert;
Ü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.
Natürlich kann das gleiche Problem auch bei anderen Ausdrücken auftreten, zum Beispiel bei arithmetischen Operationen:
⇓
print 4 + 7 $var;
PHP kann hier nicht erraten, ob die Variable addiert, subtrahiert oder verglichen werden soll usw.
Dasselbe gilt für Syntaxlisten, wie z.B. in Array-Populationen, wo der Parser auch ein erwartetes Komma ,
anzeigt:
⇓
$var = array("1" => $val, $val2, $val3 $val4);
Oder Funktionen Parameterlisten:
⇓
Funktion myfunc($param1, $param2 $param3, $param4)
Ähnlich verhält es sich mit list
oder global
Anweisungen, oder wenn ein ;
Semikolon in einer for
Schleife fehlt.
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:
class xyz { ⇓.
var $value = $_GET["input"];
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.
Sie können auch niemals eine Variable direkt nach einem Bezeichner einfügen:
⇓
$this->myFunc$VAR();
Ü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.
Hastiges Tippen kann dazu führen, dass öffnende Klammern vergessen werden
für if
und for
und foreach
Anweisungen:
⇓
foreach $array as $key) {
Lösung: Fügen Sie das fehlende öffnende (
zwischen Anweisung und Variable ein.
⇓
else ($var >= 0)
Lösung: Entfernen Sie die Bedingungen aus else
oder verwenden Sie elseif
.
⇓
function() verwendet $var {}
Lösung: Fügen Sie Klammern um $var
hinzu.
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:
<?php
⇐
$var = new PDO(...);
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.
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.
<?xml
Kopfzeilen in PHP-Skripten