Jeder stößt auf Syntaxfehler. Selbst erfahrene Programmierer machen Tippfehler. Für Neulinge ist es nur ein Teil des Lernprozesses. Es ist jedoch oft einfach, Fehlermeldungen zu interpretieren, wie z.
PHP-Analysefehler: Syntaxfehler, unerwartetes '{' in index.php in Zeile 20
Das unerwartete Symbol ist nicht immer der wahre Schuldige. Die Zeilennummer gibt jedoch eine ungefähre Vorstellung davon, wo Sie anfangen sollen zu suchen.
Schauen Sie immer auf dem Code Kontext . Der Syntaxfehler verbirgt sich häufig in den genannten oder in früheren Codezeilen . Vergleichen Sie Ihren Code mit Syntaxbeispielen aus dem Handbuch.
Zwar passt nicht jeder Fall zum anderen. Es gibt jedoch einige allgemeine Schritte, um Syntaxfehler zu beheben . Diese Referenzen fassten die häufigsten Fallstricke zusammen:
Unerwartetes T_VARIABLE
Unerwartetes '$ varname' (T_VARIABLE)Unerwartetes T_CONSTANT_ENCAPSED_STRING
Unerwartetes T_ENCAPSED_AND_WHITESPACEUnerwartet weiter (T_CONTINUE)
Unerwartet weiter (T_BREAK)
Unerwartet weiter (T_RETURN)Unerwartetes Zeichen in der Eingabe: '
\
' (ASCII = 92) state = 1Unerwartet
,
(Komma)Unerwartet
.
(Punkt)Unerwartet
;
(Semikolon)Unerwartet
*
(Sternchen)Unerwartet
:
(Doppelpunkt)Unerwartet
&
(Anrufzeitübergabe)
Eng verwandte Referenzen:
- Was bedeutet dieser Fehler in PHP? (Laufzeitfehler)
- Was bedeutet dieses Symbol in PHP? (Sprachmarken)
- Diese
“”
intelligenten‘’
Zitate bedeuten PHP nichts
Und:
- Das PHP-Handbuch auf php.net und seine verschiedenen Sprach-Token
- Oder die Einführung der Wikipedia- Syntax in PHP .
- Und zum Schluss natürlich unser PHP- Tag-Wiki .
Während Stack Overflow auch Rookie-Codierer willkommen heißt, ist es hauptsächlich auf professionelle Programmierfragen ausgerichtet.
- Die Beantwortung von Codierungsfehlern und engen Tippfehlern wird meist als nicht thematisch angesehen.
- Nehmen Sie sich also bitte die Zeit, um die grundlegenden Schritte zu befolgen , bevor Sie Syntaxkorrekturanforderungen veröffentlichen.
- Wenn Sie dies dennoch tun müssen, zeigen Sie bitte Ihre eigene Lösungsinitiative, versuchte Korrekturen und Ihren Denkprozess darüber, was falsch aussieht oder möglicherweise falsch ist.
Wenn dein Browser Fehlermeldungen wie "SyntaxError: unzulässiges Zeichen" anzeigt, ist dies nicht der Fallphp-bezogen, aber a Javascript- Syntaxfehler .
Syntaxfehler beim Herstellercode: Beachten Sie schließlich, dass der Syntaxfehler nicht durch Bearbeiten Ihrer Codebasis, sondern nach der Installation oder Aktualisierung eines externen Herstellerpakets auf eine Inkompatibilität der PHP-Version zurückzuführen sein kann. Überprüfen Sie daher die Anforderungen des Herstellers anhand Ihrer Plattform installieren.
quelle
T_IF / T_FOREACH / ...
Block. Obwohl ich eine individuellere Zusammenfassung für IF / ELSE / ELSEIF-Fragen erstellen wollte.Antworten:
Was sind die Syntaxfehler?
PHP gehört zu den Programmiersprachen C-Stil und Imperativ . Es hat starre Grammatikregeln, von denen es sich nicht erholen kann, wenn es auf falsch platzierte Symbole oder Bezeichner stößt. Es kann Ihre Codierungsabsichten nicht erraten.
Wichtigste Tipps
Es gibt einige grundlegende Vorsichtsmaßnahmen, die Sie immer treffen können:
Verwenden Sie die richtige Codeeinrückung oder verwenden Sie einen beliebigen hohen Codierungsstil. Lesbarkeit verhindert Unregelmäßigkeiten.
Verwenden Sie eine IDE oder einen Editor für PHP mit Syntaxhervorhebung . Welche helfen auch beim Ausgleich von Klammern / Klammern.
Lesen Sie die Sprachreferenz und Beispiele im Handbuch. Zweimal, um etwas kompetenter zu werden.
So interpretieren Sie Parserfehler
Eine typische Syntaxfehlermeldung lautet:
Hier wird der mögliche Ort eines Syntaxfehlers aufgelistet . Siehe den genannten Dateinamen und Zeilennummer .
Ein Spitzname wie
T_STRING
erklärt , welches Symbol der Parser / tokenizer nicht endgültig verarbeiten kann. Dies ist jedoch nicht unbedingt die Ursache für den Syntaxfehler.Es ist wichtig zu untersuchen vorherige Codezeilen . Oft sind Syntaxfehler nur Pannen, die früher aufgetreten sind. Die Fehlerzeilennummer ist genau dort, wo der Parser endgültig aufgegeben hat, um alles zu verarbeiten.
Syntaxfehler lösen
Es gibt viele Ansätze, um Syntaxprobleme einzugrenzen und zu beheben.
Öffnen Sie die angegebene Quelldatei. Schauen Sie sich die erwähnte Codezeile an .
Bei außer Kontrolle geratenen Zeichenfolgen und falsch platzierten Operatoren finden Sie hier normalerweise den Schuldigen.
Lesen Sie die Zeile von links nach rechts und stellen Sie sich vor, was jedes Symbol tut.
Regelmäßiger müssen Sie auch die vorhergehenden Zeilen betrachten .
Insbesondere fehlen fehlende
;
Semikolons an den vorherigen Zeilenenden / Anweisungen. (Zumindest aus stilistischer Sicht.)Wenn
{
Codeblöcke}
falsch geschlossen oder verschachtelt sind, müssen Sie den Quellcode möglicherweise noch weiter untersuchen. Verwenden Sie die richtige Codeeinrückung , um dies zu vereinfachen.Schauen Sie sich die Syntaxfärbung an !
Zeichenfolgen, Variablen und Konstanten sollten alle unterschiedliche Farben haben.
Die Bediener
+-*/.
sollten ebenfalls deutlich getönt sein. Sonst könnten sie im falschen Kontext sein.Wenn sich die Färbung der Zeichenfolgen zu weit oder zu kurz erstreckt, haben Sie eine nicht entflohene oder fehlende Abschluss-
"
oder'
Zeichenfolgenmarkierung gefunden.Zwei gleichfarbige Interpunktionszeichen nebeneinander zu haben, kann ebenfalls Probleme verursachen. Normalerweise sind Operatoren allein, wenn dies nicht der Fall
++
ist--
, oder Klammern, die einem Operator folgen. Zwei Zeichenfolgen / Bezeichner, die direkt aufeinander folgen, sind in den meisten Kontexten falsch.Whitespace ist dein Freund . Befolgen Sie einen beliebigen Codierungsstil.
Brechen Sie lange Schlangen vorübergehend auf.
Sie können frei Zeilenumbrüche zwischen Operatoren oder Konstanten und Zeichenfolgen hinzufügen . Der Parser konkretisiert dann die Zeilennummer für Analysefehler. Anstatt sich den sehr langen Code anzusehen, können Sie das fehlende oder falsch platzierte Syntaxsymbol isolieren.
Teilen Sie komplexe
if
Anweisungen in unterschiedliche oder verschachtelteif
Bedingungen auf.Verwenden Sie anstelle langer mathematischer Formeln oder Logikketten temporäre Variablen, um den Code zu vereinfachen. (Mehr lesbar = weniger Fehler.)
Fügen Sie Zeilenumbrüche hinzu zwischen:
Das Partitionieren langer Codeblöcke hilft wirklich dabei, den Ursprung von Syntaxfehlern zu lokalisieren.
Kommentieren Sie Code zu verletzen.
Wenn Sie die Problemquelle nicht isolieren können, beginnen Sie mit dem Auskommentieren (und damit vorübergehenden Entfernen) von Codeblöcken.
Sobald Sie den Parsing-Fehler behoben haben, haben Sie die Problemquelle gefunden. Schau dort genauer hin.
Manchmal möchten Sie vorübergehend vollständige Funktions- / Methodenblöcke entfernen. (Bei nicht übereinstimmenden geschweiften Klammern und falsch eingerücktem Code.)
Wenn Sie das Syntaxproblem nicht beheben können, versuchen Sie, die auskommentierten Abschnitte von Grund auf neu zu schreiben .
Vermeiden Sie als Neuling einige der verwirrenden Syntaxkonstrukte.
Der ternäre
? :
Bedingungsoperator kann Code komprimieren und ist in der Tat nützlich. Die Lesbarkeit wird jedoch nicht in allen Fällen verbessert. Bevorzugen Sie einfacheif
Anweisungen, wenn Sie nicht umgekehrt sind.PHP alternative Syntax (
if:
/elseif:
/endif;
) ist üblich , für Vorlagen, aber wohl weniger leicht zu folgen als normale{
Code -}
Blöcke.Die häufigsten Fehler bei Neulingen sind:
Fehlende Semikolons
;
zum Beenden von Anweisungen / Zeilen.Nicht übereinstimmende Zeichenfolgen in Anführungszeichen für
"
oder'
und nicht angeführte Anführungszeichen innerhalb.Vergessene Operatoren, insbesondere für die
.
Verkettung von Zeichenfolgen .Unausgeglichene
(
Klammern)
. Zählen Sie sie in der angegebenen Zeile. Gibt es eine gleiche Anzahl von ihnen?Vergessen Sie nicht, dass das Lösen eines Syntaxproblems das nächste aufdecken kann.
Wenn Sie ein Problem beseitigen, andere jedoch in einem der folgenden Codes auftauchen, sind Sie meistens auf dem richtigen Weg.
Wenn nach dem Bearbeiten eines neuen Syntaxfehlers in derselben Zeile ein Fehler auftritt, ist Ihr Änderungsversuch möglicherweise ein Fehler. (Nicht immer.)
Stellen Sie eine Sicherung des zuvor funktionierenden Codes wieder her, wenn Sie ihn nicht reparieren können.
diff
der defekten und letzten Arbeitsversionen anzeigen . Das könnte aufschlussreich sein, was das Syntaxproblem ist.Unsichtbare streunende Unicode-Zeichen : In einigen Fällen müssen Sie einen Hexeditor oder einen anderen Editor / Viewer für Ihre Quelle verwenden. Einige Probleme können nicht nur durch Betrachten Ihres Codes gefunden werden.
Versuchen Sie
grep --color -P -n "\[\x80-\xFF\]" file.php
als erste Maßnahme, Nicht-ASCII-Symbole zu finden.Insbesondere Stücklisten, Leerzeichen mit der Breite Null oder nicht unterbrechende Leerzeichen und intelligente Anführungszeichen können regelmäßig in den Quellcode gelangen.
Achten Sie darauf, welche Arten von Zeilenumbrüchen in Dateien gespeichert werden.
PHP \nberücksichtigt nur Zeilenumbrüche, keine \rWagenrückläufe.
Dies ist gelegentlich ein Problem für MacOS-Benutzer (auch unter OS X für falsch konfigurierte Editoren).
Es tritt häufig nur dann als Problem auf, wenn einzeilige
//
oder#
Kommentare verwendet werden. Mehrzeilige/*...*/
Kommentare stören den Parser selten, wenn Zeilenumbrüche ignoriert werden.Wenn Ihr Syntaxfehler nicht über das Web übertragen wird : Es kommt vor, dass auf Ihrem Computer ein Syntaxfehler vorliegt. Wenn Sie jedoch dieselbe Datei online veröffentlichen, wird sie nicht mehr angezeigt. Was nur eines von zwei Dingen bedeuten kann:
Sie sehen die falsche Datei!
Oder Ihr Code enthielt unsichtbaren streunenden Unicode (siehe oben). Sie können es leicht herausfinden: Kopieren Sie einfach Ihren Code aus dem Webformular zurück in Ihren Texteditor.
Überprüfen Sie Ihre PHP-Version . Nicht alle Syntaxkonstrukte sind auf jedem Server verfügbar.
php -v
für den Befehlszeileninterpreter<?php phpinfo();
für den über den Webserver aufgerufenen.Das ist nicht unbedingt dasselbe. Insbesondere wenn Sie mit Frameworks arbeiten, werden Sie diese aufeinander abstimmen.
Verwenden Sie die reservierten Schlüsselwörter von PHP nicht als Bezeichner für Funktionen / Methoden, Klassen oder Konstanten.
Versuch und Irrtum ist Ihr letzter Ausweg.
Wenn alles andere fehlschlägt, können Sie Ihre Fehlermeldung jederzeit googeln . Die Suche nach Syntaxsymbolen ist nicht so einfach (der Stapelüberlauf selbst wird von SymbolHound indiziert ). Daher kann es einige Wochen dauern, bis Sie etwas Relevantes gefunden haben.
Weitere Anleitungen:
Weißer Bildschirm des Todes
Wenn Ihre Website nur leer ist, ist normalerweise ein Syntaxfehler die Ursache. Aktivieren Sie ihre Anzeige mit:
error_reporting = E_ALL
display_errors = 1
In Ihrem
php.ini
allgemeinen oder via.htaccess
für mod_php oder sogar.user.ini
mit FastCGI-Setups.Das Aktivieren innerhalb des fehlerhaften Skripts ist zu spät, da PHP nicht einmal die erste Zeile interpretieren / ausführen kann. Eine schnelle Problemumgehung besteht darin, ein Wrapper-Skript zu erstellen, z. B
test.php
.:Rufen Sie dann den fehlerhaften Code auf, indem Sie auf dieses Wrapper-Skript zugreifen.
Es ist auch hilfreich, PHPs zu aktivieren
error_log
und die Webserver zu überprüfen,error.log
wenn ein Skript mit HTTP 500-Antworten abstürzt.quelle
error_reporting(E_ALL | E_STRICT);
für frühere Versionen von PHPIch denke, dieses Thema ist völlig überdiskutiert / überkompliziert. Die Verwendung einer IDE ist DER Weg, um Syntaxfehler vollständig zu vermeiden. Ich würde sogar sagen, dass das Arbeiten ohne IDE unprofessionell ist. Warum? Weil moderne IDEs Ihre Syntax nach jedem eingegebenen Zeichen überprüfen. Wenn Sie codieren und Ihre gesamte Zeile rot wird und ein großer Warnhinweis den genauen Typ und die genaue Position des Syntaxfehlers anzeigt, müssen Sie absolut nicht nach einer anderen Lösung suchen.
Die Verwendung einer Syntaxprüfungs-IDE bedeutet:
Sie werden (effektiv) nie wieder auf Syntaxfehler stoßen, einfach weil Sie sie während der Eingabe richtig sehen. Ernsthaft.
Hervorragende IDEs mit Syntaxprüfung (alle für Linux, Windows und Mac verfügbar):
quelle
Unerwartet
[
Heutzutage tritt die unerwartete
[
Array-Klammer häufig bei veralteten PHP-Versionen auf. Die kurze Array-Syntax ist verfügbar, da PHP > = 5.4 . Ältere Installationen unterstützen nurarray()
.Die Dereferenzierung der Array-Funktionsergebnisse ist für ältere PHP-Versionen ebenfalls nicht verfügbar:
Referenz - Was bedeutet dieser Fehler in PHP? - "Syntaxfehler, unerwartet
\[
" zeigt die häufigsten und praktischsten Problemumgehungen.Sie sind jedoch immer besser dran, wenn Sie nur Ihre PHP-Installation aktualisieren. Bei gemeinsam genutzten Webhosting-Plänen sollten Sie zunächst nachforschen, ob z. B.
SetHandler php56-fcgi
eine neuere Laufzeit möglich ist.Siehe auch:
Übrigens gibt es auch Präprozessoren und PHP 5.4-Syntax- Downkonverter, wenn Sie mit älteren + langsameren PHP-Versionen wirklich anhänglich sind.
Andere Ursachen für unerwartete
[
SyntaxfehlerWenn es sich nicht um eine Nichtübereinstimmung der PHP-Version handelt, handelt es sich häufig um einen einfachen Tippfehler oder einen neuen Syntaxfehler:
Sie können keine Array-Eigenschaftsdeklarationen / -ausdrücke in Klassen verwenden , auch nicht in PHP 7.
Das Verwechseln
[
mit dem Öffnen von geschweiften Klammern{
oder Klammern(
ist ein häufiges Versehen.Oder auch:
Oder versuchen Sie, Konstanten (vor PHP 5.6) als Arrays zu dereferenzieren:
Zumindest interpretiert PHP das
const
als konstanten Namen.Wenn Sie auf eine Array-Variable zugreifen wollten (was hier die typische Ursache ist), fügen Sie das führende
$
Siegel hinzu - so wird es zu einem$varname
.Sie versuchen, das
global
Schlüsselwort für ein Mitglied eines assoziativen Arrays zu verwenden. Dies ist keine gültige Syntax:Unerwartetes
]
Schließen der eckigen KlammerDies ist etwas seltener, aber es gibt auch Syntaxunfälle mit der abschließenden Array-
]
Klammer.Wiederum sind Fehlpaarungen mit
)
Klammern oder}
geschweiften Klammern häufig:Oder versuchen Sie, ein Array zu beenden, wo es keines gibt:
Dies tritt häufig in mehrzeiligen und verschachtelten Array-Deklarationen auf.
Verwenden Sie in diesem Fall Ihre IDE für die Klammerübereinstimmung, um einen vorzeitigen
]
Array-Abschluss zu finden . Verwenden Sie zumindest mehr Abstände und Zeilenumbrüche, um sie einzugrenzen.quelle
Unerwartetes T_VARIABLE
Ein "unerwartetes
T_VARIABLE
" bedeutet, dass es ein Literal gibt$variable
, der nicht in die aktuelle Ausdrucks- / Anweisungsstruktur passt.fehlendes Semikolon
Am häufigsten wird ein fehlendes Semikolon in der vorherigen Zeile angezeigt . Variablenzuweisungen nach einer Anweisung sind ein guter Indikator dafür, wo Sie suchen müssen:
String-Verkettung
Ein häufiges Missgeschick sind Verkettungen von Zeichenfolgen mit vergessenen
.
Operatoren:Übrigens sollten Sie die Zeichenfolgeninterpolation (Basisvariablen in doppelten Anführungszeichen) bevorzugen, wenn dies die Lesbarkeit verbessert. Dadurch werden diese Syntaxprobleme vermieden.
Fehlende Ausdrucksoperatoren
Natürlich kann das gleiche Problem auch bei anderen Ausdrücken auftreten, beispielsweise bei arithmetischen Operationen:
PHP kann hier nicht erraten , ob die Variable hinzugefügt, subtrahiert oder verglichen werden sollte usw.
Listen
Gleiches gilt für Syntaxlisten wie in Array-Populationen, in denen der Parser auch ein erwartetes Komma angibt,
,
zum Beispiel:Oder Funktionsparameterlisten:
Entsprechend sehen Sie dies mit
list
oderglobal
Anweisungen oder wenn ein;
Semikolon in einerfor
Schleife fehlt .Klassenerklärungen
Dieser Parserfehler tritt auch in Klassendeklarationen auf . Sie können nur statische Konstanten zuweisen, keine Ausdrücke. Daher beschwert sich der Parser über Variablen als zugewiesene Daten:
}
Insbesondere unübertroffene schließende geschweifte Klammern können hier führen. Wenn eine Methode zu früh beendet wird (verwenden Sie den richtigen Einzug!), Wird eine Streuvariable häufig falsch in den Klassendeklarationskörper eingefügt.Variablen nach Bezeichnern
Sie können auch niemals eine Variable direkt einem Bezeichner folgen lassen :
Übrigens ist dies ein häufiges Beispiel, bei dem die Absicht bestand, möglicherweise variable Variablen zu verwenden . In diesem Fall beispielsweise eine Suche
$this->{"myFunc$VAR"}();
nach variablen Eigenschaften mit .Fehlende Klammern nach Sprachkonstrukten
Hastiges Tippen kann dazu führen, dass Klammern für
if
undfor
undforeach
Anweisungen vergessen werden :Lösung: Fügen Sie die fehlende Öffnung
(
zwischen Anweisung und Variable hinzu.Die geschweifte
{
Klammer öffnet den Codeblock nicht, ohne denif
Ausdruck zuerst mit der)
schließenden Klammer zu schließen.Sonst erwartet keine Bedingungen
Lösung: Entfernen Sie die Bedingungen aus
else
oder verwenden Sieelseif
.Benötigen Sie Klammern zum Schließen
Lösung: Fügen Sie Klammern hinzu
$var
.Unsichtbares Leerzeichen
Wie in der Referenzantwort zu "Unsichtbarer streunender Unicode" (z. B. ein nicht unterbrechendes Leerzeichen ) erwähnt, wird dieser Fehler möglicherweise auch bei ahnungslosem Code angezeigt:
Es ist eher am Anfang von Dateien und beim Kopieren und Einfügen von Code verbreitet. Überprüfen Sie mit einem Hexeditor, ob Ihr Code visuell kein Syntaxproblem enthält.
Siehe auch
quelle
Unerwartetes T_CONSTANT_ENCAPSED_STRING
Unerwartetes T_ENCAPSED_AND_WHITESPACE
Die sperrigen Namen
T_CONSTANT_ENCAPSED_STRING
undT_ENCAPSED_AND_WHITESPACE
auf Angaben beziehen sich Literale ."string"
Sie werden in verschiedenen Kontexten verwendet, aber das Syntaxproblem ist ziemlich ähnlich. T_ENCAPSED… Warnungen treten im Kontext von Zeichenfolgen in doppelten Anführungszeichen auf, während T_CONSTANT… Zeichenfolgen in einfachen PHP-Ausdrücken oder -Anweisungen häufig in die Irre gehen.
Falsche Variableninterpolation
Und es kommt am häufigsten bei falscher PHP-Variableninterpolation vor:
Das Zitieren von Arrays-Schlüsseln ist im PHP-Kontext ein Muss. Bei doppelt zitierten Zeichenfolgen (oder HEREDOCs) ist dies jedoch ein Fehler. Der Parser beschwert sich über das enthaltene einfache Anführungszeichen
'string'
, da er dort normalerweise einen Literalbezeichner / Schlüssel erwartet.Genauer gesagt ist es gültig, die einfache Syntax im PHP2-Stil in doppelten Anführungszeichen für Array-Referenzen zu verwenden:
Verschachtelte Arrays oder tiefere Objektreferenzen erfordern jedoch die komplexe Syntax des Ausdrucks für geschweifte Zeichenfolgen :
Wenn Sie sich nicht sicher sind, ist dies in der Regel sicherer. Es wird oft sogar als besser lesbar angesehen. Und bessere IDEs verwenden dafür tatsächlich eine unterschiedliche Syntaxfärbung.
Fehlende Verkettung
Wenn eine Zeichenfolge einem Ausdruck folgt, jedoch keine Verkettung oder kein anderer Operator vorhanden ist, wird PHP sich über das Zeichenfolgenliteral beschweren:
Obwohl es für Sie und mich offensichtlich ist, kann PHP einfach nicht erraten, dass die Zeichenfolge dort angehängt werden sollte.
Verwirrende Anführungszeichen für Zeichenfolgen
Der gleiche Syntaxfehler tritt auf, wenn Zeichenfolgenbegrenzer verwechselt werden . Eine Zeichenfolge, die mit einem einfachen
'
oder doppelten"
Anführungszeichen beginnt, endet ebenfalls mit derselben.Dieses Beispiel begann mit doppelten Anführungszeichen. Doppelte Anführungszeichen waren jedoch auch für die HTML-Attribute bestimmt. Der beabsichtigte Verkettungsoperator in wurde jedoch als Teil einer zweiten Zeichenfolge in einfachen Anführungszeichen interpretiert.
Dies ist ein gutes Beispiel, bei dem Sie nicht in erster Linie aus doppelten Anführungszeichen ausbrechen sollten. Verwenden Sie stattdessen einfach die richtigen
\"
Escapezeichen für die Anführungszeichen der HTML-Attribute:Dies kann zwar auch zu einer Verwirrung der Syntax führen, aber alle besseren IDEs / Editoren helfen erneut, indem sie die maskierten Anführungszeichen unterschiedlich einfärben.
Fehlendes Eröffnungszitat
Gleichermaßen vergessen vergessen,
"
'
ein Rezept für Parserfehler zu öffnen / zu zitieren :Hier
', '
würde das nach einem Barwort ein String-Literal werden, wenn es offensichtlichlogin
ein String-Parameter sein sollte.Array-Listen
Wenn Sie
,
in einem Array-Erstellungsblock ein Komma verpassen , werden dem Parser zwei aufeinanderfolgende Zeichenfolgen angezeigt:Beachten Sie, dass die letzte Zeile immer ein zusätzliches Komma enthalten kann, das Übersehen eines dazwischen jedoch unverzeihlich ist. Was ohne Syntaxhervorhebung schwer zu entdecken ist.
Funktionsparameterlisten
Das Gleiche gilt für Funktionsaufrufe :
Ausreißer
Eine häufige Variante sind ganz einfach vergessene String-Terminatoren:
Hier beschwert sich PHP über zwei direkt aufeinanderfolgende String-Literale. Aber die wahre Ursache ist natürlich die nicht geschlossene vorherige Zeichenfolge.
Siehe auch
quelle
Unerwarteter T_STRING
T_STRING
ist ein bisschen eine Fehlbezeichnung. Es bezieht sich nicht auf ein Zitat"string"
. Dies bedeutet, dass eine Rohkennung gefunden wurde. Dies kann vonbare
Wörtern über übrig gebliebeneCONSTANT
oder Funktionsnamen, vergessene nicht zitierte Zeichenfolgen bis hin zu einfachem Text reichen .Falsch zitierte Zeichenfolgen
Dieser Syntaxfehler tritt jedoch am häufigsten bei falsch zitierten Zeichenfolgenwerten auf. Jedes Entkommen und Verirren
"
oder'
Zitat bildet einen ungültigen Ausdruck:Das Hervorheben der Syntax macht solche Fehler sehr offensichtlich. Es ist wichtig, sich daran zu erinnern, Backslashes zu verwenden, um
\"
doppelte oder\'
einfache Anführungszeichen zu vermeiden - je nachdem, welches als String-Gehäuse verwendet wurde ."
doppelten Anführungszeichen angezeigt werden.echo
/print
Zeilen, anstatt ein- und auszublenden. Betrachten Sie noch besser einen HEREDOC- Abschnitt.Ein weiteres Beispiel ist die Verwendung eines PHP-Eintrags in HTML-Code, der mit PHP generiert wurde:
Dies geschieht, wenn
$text
es mit vielen Zeilen groß ist und der Entwickler nicht den gesamten Wert der PHP-Variablen sieht und sich auf den Code konzentriert, der seine Quelle vergisst. Beispiel ist hierSiehe auch Was ist der Unterschied zwischen Zeichenfolgen in einfachen und doppelten Anführungszeichen in PHP? .
Nicht geschlossene Saiten
Wenn Sie einen Abschluss verpassen, tritt
"
ein Syntaxfehler normalerweise später auf. Eine nicht abgeschlossene Zeichenfolge verbraucht häufig ein bisschen Code bis zum nächsten beabsichtigten Zeichenfolgenwert:Es sind nicht nur wörtliche
T_STRING
Worte, gegen die der Parser protestieren kann. Eine weitere häufige Variante ist eineUnexpected '>'
für nicht zitierte wörtliche HTML.Nicht programmierende Anführungszeichen
Wenn Sie Code aus einem Blog oder einer Website kopieren und einfügen , wird manchmal ungültiger Code angezeigt. Typografische Anführungszeichen entsprechen nicht den Erwartungen von PHP:
Typografische / intelligente Anführungszeichen sind Unicode-Symbole. PHP behandelt sie als Teil des nebenstehenden alphanumerischen Textes. Zum Beispiel
”these
wird als konstante Kennung interpretiert. Jedes folgende Textliteral wird dann vom Parser als Barwort / T_STRING angesehen.Das fehlende Semikolon; nochmal
Wenn Sie in vorherigen Zeilen einen nicht abgeschlossenen Ausdruck haben, wird jede folgende Anweisung oder jedes folgende Sprachkonstrukt als unformatierter Bezeichner angesehen:
PHP kann einfach nicht wissen, ob Sie zwei Funktionen nacheinander ausführen wollten oder ob Sie ihre Ergebnisse multiplizieren, hinzufügen, vergleichen oder nur die eine
||
oder andere ausführen wollten .Kurze geöffnete Tags und
<?xml
Header in PHP-SkriptenDas ist eher ungewöhnlich. Wenn jedoch short_open_tags aktiviert sind, können Sie Ihre PHP-Skripte nicht starten mit einer XML-Deklaration beginnen :
PHP wird das sehen
<?
und es für sich zurückfordern. Es wird nicht verstehen, wofür der Streunerxml
gedacht war. Es wird als konstant interpretiert. Aber dasversion
wird als ein anderes Literal / eine andere Konstante angesehen. Und da der Parser zwei aufeinanderfolgende Literale / Werte ohne einen dazwischen liegenden Ausdrucksoperator nicht verstehen kann, ist dies ein Parserfehler.Unsichtbare Unicode-Zeichen
Eine äußerst abscheuliche Ursache für Syntaxfehler sind Unicode-Symbole, z. B. das nicht unterbrechende Leerzeichen . PHP erlaubt Unicode-Zeichen als Bezeichnernamen. Wenn Sie eine T_STRING-Parser-Beschwerde für völlig ahnungslosen Code erhalten, wie:
Sie müssen einen anderen Texteditor ausbrechen. Oder sogar ein Hexeditor. Was hier wie einfache Leerzeichen und Zeilenumbrüche aussieht, kann unsichtbare Konstanten enthalten. Java-basierte IDEs bemerken manchmal nicht, dass eine UTF-8-Stückliste innerhalb von Leerzeichen mit Nullbreite, Absatztrennzeichen usw. beschädigt ist. Versuchen Sie, alles erneut zu bearbeiten, Leerzeichen zu entfernen und normale Leerzeichen wieder hinzuzufügen.
Sie können dies eingrenzen, indem Sie
;
an jedem Zeilenanfang redundante Anweisungstrennzeichen hinzufügen :Das zusätzliche
;
Semikolon hier konvertiert das vorhergehende unsichtbare Zeichen in eine undefinierte konstante Referenz (Ausdruck als Anweisung). Was PHP im Gegenzug zu einem hilfreichen Hinweis macht.Das $ -Zeichen fehlt vor Variablennamen
Variablen in PHP werden durch ein Dollarzeichen gefolgt vom Namen der Variablen dargestellt.
Das Dollarzeichen (
$
) ist ein Siegel , das den Bezeichner als Namen einer Variablen kennzeichnet. Ohne dieses Siegel könnte der Bezeichner ein Sprachschlüsselwort oder eine Konstante sein .Dies ist ein häufiger Fehler, wenn der PHP-Code aus Code "übersetzt" wurde, der in einer anderen Sprache (C, Java, JavaScript usw.) geschrieben wurde. 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 erzeugen.
Entkommene Anführungszeichen
Wenn Sie
\
in einer Zeichenfolge verwenden, hat dies eine besondere Bedeutung. Dies wird als " Escape-Zeichen " bezeichnet und weist den Parser normalerweise an, das nächste Zeichen wörtlich zu nehmen.Beispiel:
echo 'Jim said \'Hello\'';
wird gedrucktJim said 'hello'
Wenn Sie dem schließenden Anführungszeichen einer Zeichenfolge entkommen, wird das abschließende Anführungszeichen wörtlich und nicht wie beabsichtigt verwendet, dh als druckbares Anführungszeichen als Teil der Zeichenfolge und nicht als schließende Zeichenfolge. Dies wird häufig als Analysefehler angezeigt, nachdem Sie die nächste Zeichenfolge oder am Ende des Skripts geöffnet haben.
Sehr häufiger Fehler bei der Angabe von Pfaden in Windows:
"C:\xampp\htdocs\"
ist falsch. Du brauchst"C:\\xampp\\htdocs\\"
.quelle
Unerwartet
(
Das Öffnen von Klammern folgt normalerweise Sprachkonstrukten wie
if
/foreach
/for
/array
/list
oder startet einen arithmetischen Ausdruck. Sie sind syntaktisch falsch nach"strings"
, nach einem vorherigen()
, einem einsamen$
und in einigen typischen Deklarationskontexten.Funktionsdeklarationsparameter
Ein selteneres Vorkommen für diesen Fehler ist der Versuch, Ausdrücke als Standardfunktionsparameter zu verwenden . Dies wird auch in PHP7 nicht unterstützt:
Parameter in einer Funktionsdeklaration können nur Literalwerte oder konstante Ausdrücke sein. Im Gegensatz zu Funktionsaufrufen, bei denen Sie frei verwenden können
whatever(1+something()*2)
, usw.Standardeinstellungen für Klasseneigenschaften
Gleiches gilt für Klassenmitgliedsdeklarationen , bei denen nur Literal- / Konstantenwerte zulässig sind, keine Ausdrücke:
Setzen Sie solche Dinge in den Konstruktor. Siehe auch Warum erlauben PHP-Attribute keine Funktionen?
Beachten Sie erneut, dass PHP 7 dort nur
var $xy = 1 + 2 +3;
konstante Ausdrücke zulässt .JavaScript-Syntax in PHP
Die Verwendung der JavaScript- oder jQuery-Syntax funktioniert in PHP aus offensichtlichen Gründen nicht:
In diesem Fall wird normalerweise eine nicht abgeschlossene vorhergehende Zeichenfolge angezeigt. und Literalabschnitte
<script>
, die in den PHP-Code-Kontext gelangen.isset (()), leer, Schlüssel, weiter, aktuell
Beide
isset()
undempty()
sind integrierte Sprachen, keine Funktionen. Sie müssen direkt auf eine Variable zugreifen . Wenn Sie versehentlich zu viele Klammern hinzufügen, erstellen Sie jedoch einen Ausdruck:Gleiches gilt für alle Sprachkonstrukte, die impliziten Zugriff auf Variablennamen erfordern. Diese integrierten Funktionen sind Teil der Sprachgrammatik und erlauben daher keine dekorativen zusätzlichen Klammern.
Funktionen auf Benutzerebene, die eine Variablenreferenz erfordern, aber ein übergebenes Ausdrucksergebnis erhalten, führen stattdessen zu Laufzeitfehlern.
Unerwartet
)
Fehlender Funktionsparameter
In einem Funktionsaufruf dürfen keine Streukommas zuletzt stehen . PHP erwartet dort einen Wert und beschwert sich daher über eine früh schließende
)
Klammer.Ein nachfolgendes Komma ist nur in
array()
oderlist()
Konstrukten zulässig .Unvollendete Ausdrücke
Wenn Sie etwas in einem arithmetischen Ausdruck vergessen, gibt der Parser auf. Denn wie sollte es das möglicherweise interpretieren:
Und wenn Sie das Schließen
)
sogar vergessen haben , erhalten Sie stattdessen eine Beschwerde über das unerwartete Semikolon.Foreach as
constant
Für vergessene Variablenpräfixe
$
in Steueranweisungen sehen Sie:PHP hier sagt Ihnen manchmal, dass es
::
stattdessen ein erwartet . Weil eine class :: $ -Variable den erwarteten $ variable-Ausdruck erfüllt haben könnte.Unerwartet
{
Geschweifte Klammern
{
und}
Codeblöcke einschließen. Und Syntaxfehler weisen normalerweise auf eine falsche Verschachtelung hin.Nicht übereinstimmende Unterausdrücke in einem
if
Am häufigsten unausgeglichen
(
und)
die Ursache, wenn sich der Parser darüber beschwert, dass die Öffnung{
zu früh erscheint. Ein einfaches Beispiel:Zählen Sie Ihre Klammern oder verwenden Sie eine IDE, die Ihnen dabei hilft. Schreiben Sie auch keinen Code ohne Leerzeichen. Lesbarkeit zählt.
{und} im Ausdruckskontext
Sie können in Ausdrücken keine geschweiften Klammern verwenden. Wenn Sie Klammern und Locken verwechseln, entspricht dies nicht der Sprachgrammatik:
Es gibt einige Ausnahmen für die Bezeichnerkonstruktion, z. B. die lokale Bereichsvariable
${references}
.Variable Variablen oder geschweifte var-Ausdrücke
Das ist ziemlich selten. Sie können aber auch Beschwerden für komplexe variable Ausdrücke erhalten
{
und}
analysieren:}
In solchen Kontexten besteht jedoch eine höhere Wahrscheinlichkeit für ein Unerwartetes .Unerwartet
}
Wenn ein "unerwarteter
}
" Fehler auftritt, haben Sie einen Codeblock meistens zu früh geschlossen.Letzte Anweisung in einem Codeblock
Dies kann für jeden nicht abgeschlossenen Ausdruck passieren.
Und wenn der letzten Zeile in einem Funktions- / Codeblock ein abschließendes
;
Semikolon fehlt :Hier kann der Parser nicht sagen, ob Sie
+ 25;
dem Funktionsergebnis noch etwas hinzufügen möchten oder etwas anderes.Ungültige Blockverschachtelung / Vergessen
{
Manchmal wird dieser Parserfehler angezeigt, wenn ein Codeblock
}
zu früh geschlossen wurde oder Sie{
sogar eine Öffnung vergessen haben :Im obigen Ausschnitt hatte der
if
keine öffnende{
geschweifte Klammer. Somit wurde der abschließende}
unten überflüssig. Und deshalb war das nächste Schließen}
, das für die Funktion vorgesehen war, nicht mit der ursprünglichen öffnenden{
geschweiften Klammer verbunden.Solche Fehler sind ohne richtigen Codeeinzug noch schwerer zu finden. Verwenden Sie eine IDE und eine Klammerübereinstimmung.
Unerwartet
{
, erwartend(
Sprachkonstrukte, die einen Bedingungs- / Deklarationsheader und einen Codeblock erfordern, lösen diesen Fehler aus.
Parameterlisten
Beispielsweise sind falsch deklarierte Funktionen ohne Parameterliste nicht zulässig:
Bedingungen für Steueranweisungen
Und Sie können auch nicht
if
ohne Bedingung haben .Was natürlich keinen Sinn ergibt. Das Gleiche gilt für die üblichen Verdächtigen,
for
/foreach
,while
/do
usw.quelle
Unerwartetes $ Ende
Wenn PHP von einem "Unerwarteten
$end
" spricht , bedeutet dies, dass Ihr Code vorzeitig beendet wurde. (Die Nachricht ist im wahrsten Sinne des Wortes etwas irreführend. Es handelt sich nicht um eine Variable mit dem Namen "$ end", wie sie manchmal von Neulingen angenommen wird. Sie bezieht sich auf das "Dateiende" EOF.)Es geht so ziemlich immer um eine fehlende
}
geschweifte Klammer, um vorhergehende Codeblöcke zu schließen.Verwenden Sie erneut die richtige Einrückung, um solche Probleme zu vermeiden.
Verwenden Sie eine IDE mit Bracket Matching, um herauszufinden, wo das nicht
}
stimmt. In den meisten IDEs und Texteditoren gibt es Tastaturkürzel:Die meisten IDEs markieren auch übereinstimmende Klammern, Klammern und Klammern. Das macht es ziemlich einfach, ihre Korrelation zu überprüfen:
Nicht abgeschlossene Ausdrücke
Und
Unexpected $end
Syntax / Parser - Fehler kann auch für ungekündigten Ausdrücke oder Aussagen auftreten:$var = func(1,
?>
EOFSchauen Sie sich also zuerst das Ende der Skripte an. Ein Trailing
;
ist für die letzte Anweisung in einem PHP-Skript häufig redundant. Aber du solltest einen haben. Gerade weil es solche Syntaxprobleme eingrenzt.Eingedrückte HEREDOC-Marker
Ein weiteres häufiges Vorkommen tritt bei HEREDOC- oder NOWDOC- Zeichenfolgen auf. Die abschließende Markierung wird bei führenden Leerzeichen, Tabulatoren usw.: Ignoriert.
Daher geht der Parser davon aus, dass die HEREDOC-Zeichenfolge bis zum Ende der Datei fortgesetzt wird (daher "Unerwartetes $ Ende"). Nahezu alle IDEs und Syntax-Hervorhebungs-Editoren machen dies deutlich oder warnen davor.
Entkommene Anführungszeichen
Wenn Sie
\
in einer Zeichenfolge verwenden, hat dies eine besondere Bedeutung. Dies wird als " Escape-Zeichen " bezeichnet und weist den Parser normalerweise an, das nächste Zeichen wörtlich zu nehmen.Beispiel:
echo 'Jim said \'Hello\'';
wird gedrucktJim said 'hello'
Wenn Sie dem schließenden Anführungszeichen einer Zeichenfolge entkommen, wird das abschließende Anführungszeichen wörtlich und nicht wie beabsichtigt verwendet, dh als druckbares Anführungszeichen als Teil der Zeichenfolge und nicht als schließende Zeichenfolge. Dies wird häufig als Analysefehler angezeigt, nachdem Sie die nächste Zeichenfolge oder am Ende des Skripts geöffnet haben.
Sehr häufiger Fehler bei der Angabe von Pfaden in Windows:
"C:\xampp\htdocs\"
ist falsch. Du brauchst"C:\\xampp\\htdocs\\"
.Alternative Syntax
Etwas seltener können Sie diesen Syntaxfehler sehen, wenn Sie die alternative Syntax für Anweisungs- / Codeblöcke in Vorlagen verwenden. Verwenden Sie
if:
undelse:
und ein fehltendif;
zum Beispiel.Siehe auch:
quelle
Unerwartetes T_IF
Unerwartetes T_ELSEIF
Unerwartetes T_ELSE
Unerwartetes T_ENDIF
Bedingte Steuerblöcke
if
,elseif
undelse
folgen einer einfachen Struktur. Wenn Sie auf einen Syntaxfehler stoßen, handelt es sich höchstwahrscheinlich nur um eine ungültige Blockverschachtelung → mit fehlenden{
geschweiften Klammern}
- oder einer zu vielen.Fehlende
{
oder}
falsche EinrückungNicht übereinstimmende Codeklammern treten häufig bei weniger gut formatiertem Code auf, z.
Wenn Ihr Code so aussieht, beginnen Sie neu! Andernfalls kann es weder für Sie noch für andere Personen behoben werden. Es macht keinen Sinn, dies im Internet zu präsentieren, um um Hilfe zu bitten.
Sie können das Problem nur beheben, wenn Sie die verschachtelte Struktur und Beziehung der if / else-Bedingungen und ihrer
{
Codeblöcke visuell verfolgen können}
. Verwenden Sie Ihre IDE, um festzustellen, ob alle gepaart sind.Jedes Double
}
}
schließt nicht nur einen Zweig, sondern eine vorherige Bedingungsstruktur. Halten Sie sich daher an einen Codierungsstil. Nicht in verschachtelten if / else-Bäumen mischen und anpassen.Abgesehen von der Konsistenz erweist es sich hier als hilfreich, auch langwierige Bedingungen zu vermeiden. Verwenden Sie temporäre Variablen oder Funktionen, um unlesbare
if
Ausdrücke zu vermeiden .IF
kann nicht in Ausdrücken verwendet werdenEin überraschend häufiger Fehler eines Neulings ist der Versuch, eine
if
Anweisung in einem Ausdruck zu verwenden, z. B. eine print-Anweisung:Welches ist natürlich ungültig.
Sie können eine ternäre Bedingung verwenden , achten Sie jedoch auf die Auswirkungen auf die Lesbarkeit.
Andernfalls brechen Sie solche Ausgabekonstrukte auf: Verwenden Sie mehrere
if
s undecho
s .Besser noch, verwenden Sie temporäre Variablen und stellen Sie Ihre Bedingungen vor:
Das Definieren von Funktionen oder Methoden für solche Fälle ist oft auch sinnvoll.
Steuerblöcke geben keine "Ergebnisse" zurück
Dies ist zwar weniger häufig, aber einige Programmierer versuchen sogar, so zu behandeln,
if
als ob ein Ergebnis zurückgegeben werden könnte :Dies ist strukturell identisch mit der Verwendung
if
innerhalb einer Zeichenfolgenverkettung / eines Ausdrucks.Sie müssen eine Zuordnung im Codeblock verwenden :
Alternativ können Sie auf einen
?:
ternären Vergleich zurückgreifen .Wenn in Wenn
Sie können auch keine
if
innerhalb einer Bedingung verschachteln :Was offensichtlich überflüssig ist, weil das
and
(oderor
) bereits Verkettungsvergleiche erlaubt.Vergessene
;
SemikolonsNoch einmal: Jeder Steuerblock muss eine Anweisung sein. Wenn das vorherige Codeteil nicht durch ein Semikolon abgeschlossen wird, ist dies ein garantierter Syntaxfehler:
Übrigens benötigt die letzte Zeile in einem
{…}
Codeblock auch ein Semikolon.Semikolon zu früh
Jetzt ist es wahrscheinlich falsch, einen bestimmten Codierungsstil zu beschuldigen, da diese Falle zu leicht zu übersehen ist:
Was öfter passiert, als Sie sich vorstellen können.
if ()
Ausdruck;
damit beenden , wird eine void-Anweisung ausgeführt. Das;
wird ein{}
Eigenes!{…}
Block ist somit vom gelöstif
und würde immer laufen.else
keine Beziehung mehr zu einem offenenif
Konstrukt, weshalb dies zu einem unerwarteten T_ELSE-Syntaxfehler führen würde.Dies erklärt auch eine ebenfalls subtile Variation dieses Syntaxfehlers:
Wobei der
;
Codeblock nach dem Code{…}
das gesamteif
Konstrukt beendet und denelse
Zweig syntaktisch trennt .Keine Codeblöcke verwenden
Es ist syntaktisch erlaubt, geschweifte Klammern wegzulassen
{
…}
für Codeblöcke inif
/elseif
/else
Zweigen. Was leider ein Syntaxstil ist, der bei nicht versierten Codierern sehr verbreitet ist. (Unter der falschen Annahme war dies schneller zu tippen oder zu lesen).Es ist jedoch sehr wahrscheinlich, dass dies die Syntax beeinträchtigt. Früher oder später finden zusätzliche Anweisungen Eingang in die if / else-Zweige:
Aber tatsächlich Codeblöcke verwenden zu können, müssen zu schreiben
{
...}
sie als solche!Sonst / Elseif in falscher Reihenfolge
Eine Sache, an die Sie sich erinnern sollten, ist natürlich die bedingte Reihenfolge .
Sie können so viele
elseif
s haben, wie Sie möchten, müssen aberelse
zuletzt gehen . Ist einfach so.Klassenerklärungen
Wie oben erwähnt , können Sie in einer Klassendeklaration keine Steueranweisungen haben:
Sie haben entweder eine Funktionsdefinition vergessen oder
}
in solchen Fällen eine zu früh geschlossen .Unerwartetes T_ELSEIF / T_ELSE
Beim Mischen von PHP und HTML muss sich das Schließen
}
für aif/elseif
im selben PHP-Block<?php ?>
wie das nächste befindenelseif/else
. Dies führt zu einem Fehler, da das Schließen}
für dieif
Anforderungen Teil vonelseif
:Die richtige Form
<?php } elseif
:Dies ist mehr oder weniger eine Variation falscher Einrückungen - vermutlich oft aufgrund falscher Codierungsabsichten.
Sie können keine anderen Anweisungen zwischen
if
undelseif
/ oderelse
strukturellen Token mischen:Beides kann nur in
{…}
Codeblöcken auftreten, nicht zwischen Kontrollstruktur-Token.if
undelse
Zweigen springt .Sie können ein if / else auch nicht zwischen verschiedenen Kontrollstrukturen trennen:
Es gibt keine syntaktische Beziehung zwischen
if
undelse
. Derforeach
lexikalische Bereich endet bei}
, sodass es keinen Sinn macht, dieif
Struktur fortzusetzen.T_ENDIF
Wenn ein unerwartetes T_ENDIF beanstandet wird, verwenden Sie den alternativen Syntaxstil
if:
⋯elseif:
⋯else:
⋯endif;
. Worüber Sie wirklich zweimal nachdenken sollten.Eine häufige Gefahr besteht darin, den unheimlich ähnlichen
:
Doppelpunkt mit einem;
Semikolon zu verwechseln . (In "Semikolon zu früh" behandelt)Da Einrückungen in Vorlagendateien schwieriger zu verfolgen sind, gilt dies umso mehr, wenn Sie die alternative Syntax verwenden. Es ist plausibel, dass Sie mit
endif;
keiner übereinstimmenif:
.Die Verwendung
} endif;
ist ein Doppelterminatorif
.Während ein "unerwartetes $ Ende" normalerweise der Preis für eine vergessene schließende
}
geschweifte Klammer ist.Zuordnung vs. Vergleich
Dies ist also kein Syntaxfehler, aber in diesem Zusammenhang erwähnenswert:
Das ist kein
==
/===
Vergleich, sondern eine=
Aufgabe . Dies ist ziemlich subtil und führt einige Benutzer leicht dazu, ganze Bedingungsblöcke hilflos zu bearbeiten. Achten Sie zuerst auf unbeabsichtigte Aufgaben - wenn Sie einen logischen Fehler / ein falsches Verhalten feststellen.quelle
Unerwartet T_IS_EQUAL
Unerwartet T_IS_GREATER_OR_EQUAL
Unerwartet T_IS_IDENTICAL
Unerwartet T_IS_NOT_EQUAL
Unerwartet T_IS_NOT_IDENTICAL
Unerwartet T_IS_SMALLER_OR_EQUAL
Unerwartet
<
Unerwartet
>
Vergleichsoperatoren wie
==
,>=
,===
,!=
,<>
,!==
und<=
oder<
und>
vor allem sollten nur in Ausdrücken, wie verwendet werdenif
Ausdrücke. Wenn sich der Parser über sie beschwert, bedeutet dies häufig eine falsche Schälung oder nicht übereinstimmende(
)
Parens um sie herum.Parens Gruppierung
Insbesondere bei
if
Aussagen mit mehreren Vergleichen müssen Sie darauf achten, die öffnende und schließende Klammer korrekt zu zählen :Hier wurde die
if
Bedingung hier bereits von der beendet)
Sobald Ihre Vergleiche ausreichend komplex sind, hilft es oft, sie in mehrere und verschachtelte
if
Konstrukte aufzuteilen .isset () mit Vergleichen vermischt
Ein häufiger Neuling ist, dass Pitfal versucht, Vergleiche anzustellen
isset()
oderempty()
zu vergleichen:Oder auch:
Das macht keinen Sinn für PHP machen, weil
isset
undempty
Sprachkonstrukte sind , die nur Variablennamen akzeptieren. Es ist auch nicht sinnvoll, das Ergebnis zu vergleichen, da die Ausgabe nur / bereits ein Boolescher Wert ist.Verwechseln von
>=
größer oder gleich mit=>
Array-OperatorBeide Operatoren sehen sich etwas ähnlich, so dass sie manchmal durcheinander geraten:
Sie müssen sich nur daran erinnern, dass dieser Vergleichsoperator " größer oder gleich " heißt, um ihn richtig zu machen.
Siehe auch: If-Anweisungsstruktur in PHP
Nichts zu vergleichen
Sie können auch nicht zwei Vergleiche kombinieren, wenn sie denselben Variablennamen betreffen:
PHP kann nicht ableiten, dass Sie die ursprüngliche Variable erneut vergleichen wollten. Ausdrücke werden normalerweise nach der Priorität des Operators gepaart , sodass zum Zeitpunkt der
<
Anzeige nur noch ein boolesches Ergebnis der ursprünglichen Variablen übrig bleibt.Siehe auch: unerwartet T_IS_SMALLER_OR_EQUAL
Vergleichsketten
Sie können nicht mit einer Variablen mit einer Reihe von Operatoren vergleichen:
Dies muss in zwei Vergleiche unterteilt werden, jeweils gegen
$x
.Dies ist eigentlich eher ein Fall von Ausdrücken auf der schwarzen Liste (aufgrund der äquivalenten Operatorassoziativität). Es ist syntaktisch in einigen Sprachen im C-Stil gültig, aber PHP würde es auch nicht als erwartete Vergleichskette interpretieren.
Unerwartet
>
Unerwartet
<
Die Operatoren größer
>
oder kleiner als<
haben keinen benutzerdefiniertenT_XXX
Tokenizer-Namen. Und obwohl sie wie alle anderen verlegt werden können, beklagt sich der Parser häufiger über falsch zitierte Zeichenfolgen und gestampftes HTML:Dies bedeutet, dass eine Zeichenfolge
"<a href='z"
mit>
einer Literalkonstante verglichenHello
und anschließend erneut<
verglichen wird. Zumindest sieht PHP das so. Die eigentliche Ursache und der Syntaxfehler waren die vorzeitige"
Beendigung der Zeichenfolge .Es ist auch nicht möglich, PHP-Start-Tags zu verschachteln:
Siehe auch:
quelle
Unerwartetes T_IF
Unerwartetes T_FOREACH
Unerwartetes T_FOR
Unerwartetes T_WHILE
Unerwartetes T_DO
Unerwartetes T_ECHO
Steuerkonstrukte wie
if
,foreach
,for
,while
,list
,global
,return
,do
,print
,echo
nur als Anweisungen verwendet werden kann. Sie wohnen normalerweise alleine in einer Leitung.Semikolon; wo bist du?
Ziemlich allgemein haben Sie ein Semikolon in der vorherigen Zeile verpasst , wenn sich der Parser über eine Steueranweisung beschwert:
Lösung: Schauen Sie in die vorherige Zeile. Semikolon hinzufügen.
Klassenerklärungen
Ein weiterer Ort, an dem dies auftritt, sind Klassendeklarationen . Im Klassenabschnitt können Sie nur Eigenschaftsinitialisierungen und Methodenabschnitte auflisten. Dort darf sich kein Code befinden.
Solche Syntaxfehler treten häufig bei falsch verschachtelten
{
und auf}
. Insbesondere wenn Funktionscodeblöcke zu früh geschlossen wurden.Anweisungen im Ausdruckskontext
Die meisten Sprachkonstrukte können nur als Anweisungen verwendet werden . Sie sollen nicht in andere Ausdrücke eingefügt werden:
Ebenso können Sie keine
if
in Strings, mathematischen Ausdrücken oder anderswo verwenden:Um bestimmte
if
Bedingungen in einen Ausdruck einzubetten, möchten Sie häufig eine?:
ternäre Auswertung verwenden .Das gleiche gilt für
for
,while
,global
,echo
und ein geringeres Ausmaßlist
.Während
print()
eine Sprache eingebaut ist, die im Ausdruckskontext verwendet werden kann. (Macht aber selten Sinn.)Reservierte Schlüsselwörter als Bezeichner
Sie können auch keine
do
oderif
andere Sprachkonstrukte für benutzerdefinierte Funktionen oder Klassennamen verwenden. (Vielleicht in PHP 7. Aber selbst dann wäre es nicht ratsam.)quelle
Unerwartetes '?'
Wenn Sie versuchen, den Null-Koaleszenz-Operator
??
in einer Version von PHP vor PHP 7 zu verwenden, wird dieser Fehler angezeigt.Unerwartetes '?', Erwartete Variable
Ein ähnlicher Fehler kann für nullfähige Typen auftreten, wie in:
Dies weist wiederum darauf hin, dass eine veraltete PHP-Version verwendet wird (entweder die CLI-Version
php -v
oder die an den Webserver gebundenephpinfo();
).quelle
Unerwartetes T_LNUMBER
Das Token
T_LNUMBER
bezieht sich auf eine "lange" / Nummer.Ungültige Variablennamen
In PHP und den meisten anderen Programmiersprachen können Variablen nicht mit einer Zahl beginnen. Das erste Zeichen muss alphabetisch oder ein Unterstrich sein.
Sehr häufig wird die Verwendung von
preg_replace
Platzhaltern"$1"
im PHP-Kontext verwendet:Wo der Rückruf hätte zitiert werden sollen. (Jetzt ist das
/e
Regex-Flag veraltet. Manchmal wird es jedoch immer noch inpreg_replace_callback
Funktionen missbraucht .)Die gleiche Kennung constraint gilt für Objekteigenschaften , btw.
Während der Tokenizer / Parser kein Literal
$1
als Variablennamen zulässt , könnte man${1}
oder verwenden${"1"}
. Dies ist eine syntaktische Problemumgehung für nicht standardmäßige Bezeichner. (Es ist am besten, es als lokale Scope-Suche zu betrachten. Aber im Allgemeinen: bevorzugen Sie einfache Arrays für solche Fälle!)Amüsanterweise, aber sehr wenig empfohlen, erlaubt der PHP-Parser Unicode-Bezeichner. so dass
$➊
wäre gültig. (Im Gegensatz zu einem Literal1
).Streunender Array-Eintrag
Ein unerwartetes langes kann auch für Array-Deklarationen auftreten - wenn
,
Kommas fehlen :Oder ebenso Funktionsaufrufe und Deklarationen und andere Konstrukte:
func(1, 2 3);
function xy($z 2);
for ($i=2 3<$z)
Normalerweise fehlt
;
oder,
fehlt eine oder mehrere Listen oder Ausdrücke.Falsch zitiertes HTML
Und wieder sind falsch zitierte Zeichenfolgen eine häufige Quelle für Streunummern:
Solche Fälle sollten mehr oder weniger wie unerwartete T_STRING- Fehler behandelt werden.
Andere Bezeichner
Weder Funktionen, Klassen noch Namespaces können benannt werden, die mit einer Zahl beginnen:
Ziemlich genau wie bei Variablennamen.
quelle
Unerwartetes '='
Dies kann durch ungültige Zeichen in einem Variablennamen verursacht werden. Variablennamen müssen diesen Regeln folgen:
quelle
Unerwartetes 'Weiter' (T_CONTINUE)
continue
ist eine Anweisung (wie für oder wenn) und muss eigenständig erscheinen. Es kann nicht als Teil eines Ausdrucks verwendet werden. Zum Teil, weil continue keinen Wert zurückgibt, aber in einem Ausdruck muss jeder Unterausdruck einen Wert ergeben, damit der Gesamtausdruck zu einem Wert führt. Das ist der Unterschied zwischen einer Aussage und einem Ausdruck.Das bedeutet, dass
continue
es nicht in einer ternären Anweisung oder einer Anweisung verwendet werden kann, für die ein Rückgabewert erforderlich ist.Unerwartete Pause (T_BREAK)
Gleiches gilt
break;
natürlich. Es ist auch nicht im Ausdruckskontext verwendbar, sondern eine strenge Anweisung (auf derselben Ebene wieforeach
oder einif
Block).Unerwartete 'Rückkehr' (T_RETURN)
Das mag überraschender sein
return
, aber das ist auch nur eine Aussage auf Blockebene . Es gibt zwar einen Wert (oder NULL) an den höheren Bereich / die höhere Funktion zurück, wird jedoch nicht als Ausdruck selbst ausgewertet. → Das heißt: Es macht keinen Sinn, dies zu tunreturn(return(false);;
quelle
Unerwartetes '.'
Dies kann auftreten, wenn Sie versuchen, den splat-Operator (
...
) in einer nicht unterstützten Version von PHP zu verwenden....
wurde erstmals in PHP 5.6 verfügbar, um eine variable Anzahl von Argumenten für eine Funktion zu erfassen:In PHP 7.4 können Sie es für Array-Ausdrücke verwenden .
quelle
Unerwartetes "Ende" (T_ENDWHILE)
Die Syntax verwendet einen Doppelpunkt. Wenn kein Doppelpunkt vorhanden ist, tritt der obige Fehler auf.
Die Alternative zu dieser Syntax ist die Verwendung von geschweiften Klammern:
http://php.net/manual/en/control-structures.while.php
quelle
Eine beginnende Fehlermeldung
Parse error: syntax error, unexpected ':'
kann dadurch verursacht werden, dass versehentlich eine statische KlassenreferenzClass::$Variable
als geschrieben wirdClass:$Variable
.quelle