PHP parse/syntax-Fehler; und wie sind diese zu lösen?
Jeder läuft in syntax-Fehler. Selbst erfahrene Programmierer ein Tippfehler. Für Neulinge ist es einfach Teil des Lernprozesses. Jedoch, es ist oft einfach zu interpretieren Fehlermeldungen wie:
PHP Parse error: syntax error, unexpected '{' in index.php auf der Linie 20
Unerwartetes symbol ist nicht immer der wirkliche Täter ist. Aber die Nummer der Zeile, gibt eine grobe Idee, wo zu Beginn der Suche.
Schauen immer code Kontext. Der syntax Fehler, oft versteckt in den genannten oder in vorherigen code-Zeilen. Vergleichen Sie den code auf syntax-Beispiele aus dem Handbuch.
Während nicht jeder Fall entspricht die andere. Dennoch gibt es einige die Allgemeinen Schritte, um lösen syntax Fehler.
Diese Referenzen zusammengefasst die häufigsten Fallstricke:
-
Unexpected T_CONSTANT_ENCAPSED_STRING
Unexpected T_ENCAPSED_AND_WHITESPACE -
Unerwartete weiterhin (T_CONTINUE)
Unerwartete weiterhin (T_BREAK)
Unerwartete weiterhin (T_RETURN) -
Unerwartete
(Komma)
-
Unpexected
.
(Zeit) -
Unerwartete
;
(Semikolon) -
Unerwartete
*
(Sternchen) -
Unerwartete
:
(Doppelpunkt)
Engem Zusammenhang Verweise:
- Was bedeutet dieser Fehler bedeuten in PHP? (Laufzeit-Fehler)
- Was bedeutet dieses symbol in PHP? (tokens)
- Die
""
smart -"
Anführungszeichen bedeuten nichts für PHP
Und:
- Die PHP-Handbuch auf php.net und seine verschiedenen tokens
- Oder Wikipedia syntax Einführung in PHP.
- Und schließlich unseren php tag-wiki natürlich.
Beim Stack-Überlauf ist auch Einladend rookie-Entwickler, es ist vor allem gezielt bei beruflichen Fragen zur Programmierung.
- Beantwortung jeder Codierung Fehler und schmalen Tippfehler betrachtet, hauptsächlich off-topic.
- Also bitte die Zeit nehmen, Folgen Sie den grundlegende Schritte, vor dem posten die syntax Befestigung Anfragen.
- Wenn Sie noch zu haben, bitte zeigen Sie Ihre eigene Lösung-initiative, die versuchten Korrekturen, und euren Gedanken auf, was aussieht oder falsch sein könnte.
Wenn Ihr browser zeigt Fehlermeldungen wie "SyntaxError: illegal character", dann ist es nicht wirklich php-Verwandte, aber ein javascript-syntax-Fehler.
Syntax-Fehler aufgeworfen Hersteller code: Schließlich, Bedenken Sie, dass, wenn der syntax-Fehler wurde nicht ausgelöst durch die änderung der Codebasis, aber nach einem externen Lieferanten Paket installieren oder aktualisieren, es könnte an der PHP-version Inkompatibilität, so überprüfen Sie Verkäufer Ansprüche gegen Ihre Plattform einrichten.
Sie legte eine beeindruckende Menge an Arbeit in diese. Respekt für das. Es ist wahrscheinlich sehr gut für Lehrer zu lernen, um schnell darauf hinweisen, Fehlern oder für die Erstellung von IDEs oder die Umsetzung der quick fixes. Jedoch, IDEs wird bereits effektiv tun die meiste Arbeit für Sie, da @Panique schlägt. Zusätzlich, im vielen Fällen das wieder von vorne anzufangen ist eine gute option.
Ich denke, die meisten Ursachen sind ähnlich wie die
T_IF / T_FOREACH / ...
block. Allerdings wollte ich kompilieren eine individuelle Zusammenfassung für IF/ELSE/ELSEIF Fragen.Weiß nicht, wie eine phrase, aber sollte dieses Q&Eine vielleicht ein bisschen umgeschrieben und besser strukturiert? (temp Kommentar)
Wissen Sie, ich wünschte, ich hatte diese Liste, wenn ich lernen mußte, PHP-Jahren.Sehr hilfreich, besonders für Anfänger.
InformationsquelleAutor |
Du musst angemeldet sein, um einen Kommentar abzugeben.
Was sind die syntax-Fehler?
PHP gehört zu den C-style und zwingend erforderlich Programmiersprachen. Es hat starre Grammatikregeln, die es nicht wiederherstellen, wenn die Begegnung verlegt-Symbole oder Kennzeichen. Es kann nicht erraten, Ihre Codierung Absichten.
Wichtigsten Tipps
Gibt es ein paar grundlegende Vorsichtsmaßnahmen können Sie immer nehmen:
Verwenden Sie die richtigen Einrücken von code, oder übernehmen alle hohen coding-Stil.
Die Lesbarkeit verhindert Unregelmäßigkeiten.
Verwenden Sie einIDE oder editor für PHP mit syntax-highlighting.
Die helfen auch mit Klammern/Halterung balancing.
Lesen das Referenzhandbuch und Beispiele in der Anleitung.
Zweimal, um sich etwas beherrschen.
Wie interpretieren parser-Fehler
Eine typische Fehlermeldung lautet:
Welche die möglich Lage des einen syntax-Fehler. Siehe die genannten Dateiname und Zeilennummer.
Einen moniker wie
T_STRING
erklärt, welches symbol der parser/tokenizer konnte nicht verarbeiten, schließlich. Dies ist nicht unbedingt die Ursache des syntax-Fehler, aber.Ist es wichtig zu schauen, in vorherigen code-Zeilen als gut. Oft Fehler in der syntax werden nur Pannen, was früher passiert. Die Fehler-Zeilennummer ist nur, wo der parser abschließend gab zu verarbeiten alles.
Lösung des syntax-Fehler
Gibt es viele Ansätze einzugrenzen und zu beheben syntax Schluckauf.
Öffnen Sie die erwähnte Quelle-Datei. Blick auf die erwähnten code-Zeile.
Für runaway Streicher und verlegt die Betreiber ist dies in der Regel, wo Sie den Schuldigen finden.
Lesen Sie die Zeile von Links nach rechts und sich vorstellen, was jedes symbol bedeutet.
Mehr regelmäßig, die Sie benötigen, zu betrachten, vorstehenden Zeilen als gut.
Insbesondere fehlt
;
Semikolons fehlen bei der bisherigen Linie enden/Anweisung. (Zumindest aus der stilistischen Sicht. )Wenn
{
code-Blöcke}
sind nicht richtig geschlossen oder isoliert, Sie müssen zu untersuchen, noch weiter bis in den Quellcode. Verwenden Sie die richtigen Einrücken von code zu vereinfachen.Blick auf die syntax-Einfärbung!
Strings und Variablen und Konstanten sollten alle verschiedene Farben haben.
Betreiber
+-*/.
werden sollte, Getönte deutlich wie gut. Sonst sind Sie vielleicht im falschen Kontext.Wenn Sie sehen, string Einfärbung erweitern, zu weit oder zu kurz, dann haben Sie gefunden, eine ohne Umschreibung oder fehlendes
"
oder'
string marker.Mit zwei gleichen-farbige Zeichen neben einander können auch ärger machen. In der Regel, die Betreiber sind Einzelkämpfer, wenn es nicht
++
,--
oder Klammern nach einem Betreiber. Zwei strings/IDS direkt aufeinander folgenden falsch sind in den meisten Kontexten.Whitespace ist dein Freund.
Folgen Sie alle coding style.
Brechen lange Linien vorübergehend.
Können Sie frei fügen Sie Zeilenumbrüche zwischen Operatoren oder Konstanten und strings. Der parser wird dann konkretisieren die Nummer der Zeile, für die parsing-Fehler. Anstatt sich auf dem sehr langen code, die Sie isolieren können fehlende oder falsch platzierte syntax symbol.
Aufgeteilt komplexe
if
Anweisungen in getrennte oder verschachtelteif
Bedingungen.Anstelle von langen mathematischen Formeln und Logik-Ketten, temporäre Variablen verwenden, um den code vereinfachen. (Mehr lesbar = weniger Fehler.)
Fügen Sie Zeilenumbrüche zwischen:
Partitionierung lange code-Blöcke wirklich hilft zu lokalisieren den Ursprung der syntax-Fehler.
Kommentar aus fehlerhaften code.
Wenn Sie nicht können das problem einzugrenzen Quelle, beginnen, auskommentieren (und damit vorübergehend entfernen) code-Blöcke.
Sobald Sie entledigte sich der parsing-Fehler, den Sie gefunden haben, die problem Quelle. Genauer gibt.
Manchmal vorübergehend entfernen möchten, schließen Sie Funktion/Methode blockiert. (Im Falle von unübertroffener geschweiften Klammern und falsch eingerückt code.)
Wenn Sie nicht lösen können das syntax-Problem, versuchen zu umschreiben der auskommentierten Abschnitte von Grund.
Als Neuling, zu vermeiden einige der verwirrenden syntax-Konstrukte.
Ternären
? :
Zustand kann der Betreiber kompakten code, und ist nützlich in der Tat. Aber es tut nicht-Hilfe-Lesbarkeit in allen Fällen. Lieber plainif
Aussagen während unversed.PHP alternative syntax (
if:
/elseif:
/endif;
) wird Häufig für Vorlagen, aber wohl weniger leicht zu verfolgen als normale{
code}
Blöcke.Den häufigsten Neuling Fehler sind:
Fehlende Semikolons
;
für die Beendigung Anweisungen/Zeilen.Nicht übereinstimmende Zeichenfolge Anführungszeichen für
"
oder'
und ohne Umschreibung Anführungszeichen innerhalb.Vergessen die Betreiber, insbesondere für die Zeichenfolge
.
Verkettung.Unsymmetrisch
(
Klammern)
. Sie zählen in der gemeldeten Zeile. Gibt es eine gleiche Anzahl von Ihnen?Vergessen Sie nicht, dass die Lösung eines syntax-problem aufdecken kann, die nächste.
Wenn Sie ein Problem Weg, aber andere ernten in einigen code unten, sind Sie meistens auf dem richtigen Weg.
Wenn nach der Bearbeitung eine neue syntax Fehler Pflanzen sich in der gleichen Zeile, dann Ihr versucht zu ändern, war möglicherweise ein Fehler. (Nicht immer, aber.)
Wiederherstellen eine Sicherung der bisher funktionierenden code, wenn Sie können es nicht reparieren.
diff
des gebrochenen und Letzte funktionierende version. Das könnte sehr erhellend sein, was die syntax-problem ist.Unsichtbar streunenden Unicode-Zeichen: In einigen Fällen müssen Sie verwenden Sie einen hexeditor oder anderen editor/viewer auf Ihrem Quelle. Einige Probleme lassen sich nicht nur vom Blick auf Ihren code.
Versuchen
grep --color -P -n\[\x80-\xFF\]" file.php
als erste Maßnahme zu finden, die nicht-ASCII-Zeichen.Insbesondere Stücklisten, null-Breite Leerzeichen, non-breaking-spaces und smart quotes regelmäßig finden Ihren Weg in den Quellcode.
Kümmern sich um die Art der Zeilenumbrüche gespeichert in Dateien.
PHP nur Ehrungen \n Zeilenumbrüche, nicht \r Wagenrücklauf.
Die gelegentlich ein Problem für MacOS-Benutzer (auch auf OS X für falsch konfigurierte Editoren).
Es oft nur die Flächen, als ein Problem, das beim single-line -
//
oder#
Kommentare verwendet werden. Multiline/*...*/
Kommentare tun selten stören der parser, wenn Zeilenumbrüche erhalten ignoriert.Wenn Ihr syntax-Fehler bedeutet nicht die übertragung über das web:
Es passiert, dass Sie einen syntax-Fehler auf Ihrem Computer. Aber die Buchung der gleichen Datei online nicht aufweisen, es nicht mehr. Das kann nur bedeuten, eines von zwei Dingen:
Du suchst an der falschen Datei!
Oder Ihrem code, der unsichtbar streunenden Unicode (siehe oben).
Sie können leicht herausfinden: kopieren Sie Einfach Ihren code wieder aus dem web-Formular in Ihre text-editor.
Überprüfen Sie Ihre PHP-version. Nicht alle syntax-Konstrukte verfügbar sind, auf jedem server.
php -v
für die command line interpreter<?php phpinfo();
für die man aufgerufen, über den webserver.Diese sind nicht unbedingt die gleichen. Insbesondere bei der Arbeit mit frameworks, werden Sie Sie zu passen.
Nicht verwenden Reservierte Schlüsselwörter in PHP als Bezeichner für Funktionen/Methoden, Klassen oder Konstanten.
Trial-and-error ist Ihre Letzte Ausweg.
Wenn alle Stricke reißen, können Sie immer google Ihre Fehlermeldung. Syntax Symbole nicht so einfach, zu suchen (Stack-Überlauf selbst ist indiziert durch SymbolHound obwohl). Deshalb es kann man durch ein paar Seiten, bevor Sie etwas Relevantes finden.
Weitere Führungen:
White screen of death
Wenn Ihre website ist nur leer, dann ist in der Regel ein syntax-Fehler ist die Ursache.
Aktivieren Sie Ihre Anzeige mit:
error_reporting = E_ALL
display_errors = 1
In Ihrem
php.ini
im Allgemeinen, oder über.htaccess
für mod_php,oder sogar
.Benutzer.ini
mit FastCGI-setups.Ermöglicht es innerhalb der broken-Skript ist zu spät, denn PHP kann auch nicht interpretieren/ausführen der ersten Zeile. Eine schnelle Abhilfe ist crafting ein wrapper-Skript, sagen
test.php
:Rufen Sie dann den fehlerhaften code durch den Zugriff auf diese wrapper-Skript.
Hilft es auch ermöglichen, das PHP
error_log
und schauen Sie in Ihren webserver ist der- Fehler.log
, wenn ein script abstürzt mit HTTP 500 Antworten.error_reporting(E_ALL | E_STRICT);
für frühere PHP-VersionenEinige IDEs (wie NetBeans) nicht nur Unterstützung, syntax-highlighting, sondern auch die code-Formatierung. Wenn Sie in die Gewohnheit der Formatierung von code korrekt ist und fragt die IDE formatieren, nur im Falle von Zeit zu Zeit können Sie fangen die schwer zu spot Probleme wie unerreicht Klammern.
InformationsquelleAutor
Ich denke, dieses Thema ist völlig overdiscussed/kompliziert. Mit einer IDE ist DER Weg zu gehen, um vollständig zu vermeiden, irgendwelche syntax-Fehler. Ich würde sogar sagen, dass die Arbeit ohne eine IDE ist irgendwie unprofessionell. Warum? Weil die moderne IDEs überprüfen Sie Ihre syntax nach jedem Zeichen, das Sie geben. Wenn Sie code und die gesamte Zeile wird rot, und ein großer Warnhinweis zeigt Ihnen die genaue Art und die genaue position des syntax-Fehler, dann gibt es absolut keine Notwendigkeit, eine andere Lösung suchen.
Mit einem syntax-checking IDE bedeutet:
Sie werden (praktisch) nie in einem syntax-Fehler wieder, einfach weil Sie sehen Sie rechts, wie Sie eingeben. Ernst.
Hervorragende IDEs mit syntax-Prüfung (alle von Ihnen sind verfügbar für Linux, Windows und Mac):
Ich denke, Sie sind wirklich tief in das Thema, damit ich wirklich nicht wollen, zu sagen, dass etwas falsch hier, aber alle der code, den ich (und meine Teamkollegen, Freunde-code, freelance Partner) je geschrieben habe, eine IDE-nie ausgeführt wurde, mit einem syntax-Fehler. So denke ich zumindest, Netbeans/PHPStorm ist die syntax check ist extrem leistungsfähig. Aber vielleicht habe ich deine Frage falsch verstanden. Gimme einige Stunden ... 😉
Deine Antwort ist bereits vor Ort auf. Passen würden 99% unserer Fragen. Aber für den Kontext hier möchte ich eine trade-off-Betrachtung von die IDE bietet die mehr Anfänger-freundlich tooltips. Es ist wahrscheinlich geringer zu uns, einfärbe-und Wellenlinien ausreichend, wenn Sie versiert genug. Aber ich vermute, die Unterschiede könnte wichtiger sein für Anfänger.
Manchmal ist eine IDE ist nicht eine praktikable option. Zum Beispiel, um schnell änderungen an einem WordPress-theme oder-plugin. Ja, das könnte ich kopieren den code in einer IDE, aber dann habe ich, um es zu öffnen, fügen Sie Sie alle in dort, Kopf-und all die anderen zeitraubenden Mist, wenn ich nur in der Hoffnung für ein schnelles Bearbeiten. Nun, wenn Sie die Entwicklung neuer Funktionen oder von null beginnend, dann, ja, tun Sie es in einer IDE. Sie werden es nicht bereuen nehmen, dass wenig Zeit am Anfang, um es einzurichten.
Ich sehe IDE als ein trailer, nicht nur ein Werkzeugkasten. Es ist vielleicht nicht BEHEBEN, aber es kann helfen, Sie zu finden und zu verhindern, dass syntax-Fehler. Viele Antworten hier, scheint zu sagen, dass, wenn Sie halten Ihr code sauber ist, haben weniger Chancen, einen Fehler zu machen und sind leichter zu erkennen sind. Auch mit auto-Einrückung, code-Hinweise, variable vorkommen, automatisches schließen von Klammern und die automatische Formatierung spart mir viele Tippfehler pro Tag und ist der wichtigste Vorteil, warum ich Sie verwenden. Dies ist nicht das zählen, alles andere sprengt den Rahmen dieser Frage (debugger, Datenbank-connector, uml-Diagramm, etc.) IDE-sparen Sie Zeit und verhindern, dass mehr als nur syntax-Fehler.
InformationsquelleAutor
Unerwartete
[
Diesen Tagen, die unerwartete
[
array bracket ist allgemein-gesehen auf veraltete PHP-Versionen. Die kurze array-syntax ist verfügbar seit PHP >= 5.4. Ältere Installationen unterstützen nurarray()
.Ergebnis der Funktion Array dereferenzieren, ist ebenfalls nicht verfügbar für ältere PHP-Versionen:
Referenz - Was bedeutet dieser Fehler bedeuten in PHP? - "Syntax error, unexpected
\[
" zeigt die häufigsten und praktische workarounds.Aber, bist du immer besser dran, nur aktualisieren Sie Ihre PHP-installation. Für die shared-webhosting-Pläne, die erste Forschung, wenn z.B.
SetHandler php56-fcgi
können genutzt werden, um eine neuere runtime.Siehe auch:
BTW, es gibt auch Präprozessoren und PHP 5.4-syntax-down-Wandler wenn Sie wirklich anhänglich mit älteren + langsamer PHP-Versionen.
Andere Ursachen für Unerwartete
[
syntax-FehlerWenn es nicht die PHP-version nicht übereinstimmen, dann ist es oft eine schlichte Tippfehler oder Neuling syntax Fehler:
Können Sie nicht verwenden,array-Eigenschaft Erklärungen/Ausdrücke in Klassen, auch nicht in PHP 7.
Verwirrend
[
mit geschweiften Klammern{
oder Klammern(
ist ein weit verbreiteter Fehler.Oder auch:
Oder versuchen, Sie zu dereferenzieren Konstanten (vor PHP 5.6) als arrays:
Mindestens PHP interpretiert, dass
const
als name der Konstante.Wenn Sie also Zugriff auf eine array-variable (das ist die typische Ursache hier), dann fügen Sie die führenden
$
Siegel - so wird es ein$varname
.Sie versuchen, zu verwenden die
global
Stichwort auf ein Element eines assoziativen Arrays. Dies ist keine gültige syntax:Unerwartete
]
schließen eckige KlammerDies ist etwas seltener, aber es gibt auch die syntax von Unfällen mit der Beendigung array
]
Halterung.Wieder übereinstimmungen mit
)
Klammern oder}
geschweiften Klammern sind üblich:Oder versuchen, bis zum Ende ein array, wo es nicht ein:
Dem tritt oft in multi-line und verschachtelte array-Deklarationen.
Wenn so, verwenden Sie Ihre IDE-für Klammer-matching, um jede vorzeitige
]
array-Verschluss. Zumindest verwenden Sie mehr Abstand und Zeilenumbrüche zu verengen es.InformationsquelleAutor
Unexpected T_VARIABLE
Eine "unerwartete
T_VARIABLE
" bedeutet, dass es eine wörtliche$variable
name, der passt nicht in den aktuellen Ausdruck/Anweisung Struktur.Fehlenden Semikolon
Es am häufigsten gibt ein fehlendes Semikolon in der vorherigen Zeile. Variablenzuweisungen folgenden Aussage sind ein guter Indikator, wohin Sie schauen:
String-Verkettung
Ein häufiges Missgeschick sind string-Verkettungen mit vergessen
.
Betreiber:Btw, sollte man lieber string-interpolation (basic Variablen in doppelten Anführungszeichen), wenn das hilft, die Lesbarkeit zu verbessern. Was verhindert, dass diese syntax.
Fehlende expression Betreiber
Natürlich das gleiche Problem auftreten können, in anderen Ausdrücken, zum Beispiel arithmetische Operationen:
PHP kann nicht denke hier, wenn die variable sollte wurden addiert, subtrahiert oder verglichen werden usw.
Listen
Gleiche syntax für Listen, wie in der Reihe von Populationen, in denen der parser zeigt auch eine erwartete Komma
,
zum Beispiel:Oder Funktionen, parameter-Listen:
Gleichwertig sehen Sie das
list
oderglobal
Aussagen, oder wenn das fehlen eines;
Semikolon in einerfor
Schleife.Klasse Erklärungen
Dieser parser-Fehler tritt auch auf,in der Klasse Erklärungen. Sie können nur zuordnen, statische Konstanten, nicht Ausdrücken. Damit der parser beschwert sich über die Variablen zugewiesenen Daten:
Unübertroffene
}
schließenden geschweiften Klammer kann insbesondere hier führen. Wenn eine Methode beendet wird, zu früh (verwenden Sie korrekte Einrückung!), dann eine einzelne variable ist, die Häufig verlegt in die Deklaration der Klasse Körper.Variablen nach Identifikatoren
Können Sie auch nie haben eine variable ein Bezeichner Folgen direkt:
Btw, dies ist ein häufiges Beispiel, wo die Absicht war, die Nutzung variable Variablen vielleicht. In diesem Fall ist die Eigenschaft einer Variablen lookup mit
$this->{"myFunc$VAR"}();
zum Beispiel.Fehlende Klammern nach Sprachkonstrukte
Hastige Eingabe kann dazu führen, zu vergessen öffnenden Klammer
für
if
undfor
undforeach
Aussagen:Lösung: fügen Sie die fehlende öffnung
(
zwischen Anweisung und Variablen.Sonst nicht erwarten, dass Bedingungen
Lösung: entnehmen Sie die Bedingungen aus
else
oder verwenden Sieelseif
.Müssen die Klammern für die Schließung
Lösung: Fügen Sie die Klammern um
$var
.Unsichtbare Leerzeichen
Wie gesagt in den Referenz Antwort auf "Unsichtbar streunenden Unicode" (wie ein non-breaking space), Sie können auch sehen, diesen Fehler für ahnungslose-code wie:
Ist es ziemlich weit verbreitet in den start-Dateien und für das kopieren und einfügen von code. Überprüfen Sie mit einem hexeditor, wenn Ihr code nicht visuell zu enthalten scheinen ein syntax-Problem.
Siehe auch
InformationsquelleAutor
Unexpected T_CONSTANT_ENCAPSED_STRING
Unexpected T_ENCAPSED_AND_WHITESPACE
Dem sperrigen Namen
T_CONSTANT_ENCAPSED_STRING
undT_ENCAPSED_AND_WHITESPACE
siehe zitierte"string"
Literale.Sind Sie in verschiedenen Kontexten verwendet werden, aber die syntax Problem ziemlich ähnlich sind. T_ENCAPSED... Warnungen auftreten in double quoted string-Kontext, während T_CONSTANT... Zeichenfolgen werden oft in die Irre, in plain PHP-Ausdrücke oder Aussagen.
Falsche variable interpolation
Und es kommt Häufig zur falschen PHP-Variablen-interpolation:
Zitieren arrays keys ist ein muss im PHP-Kontext. Aber in double quoted strings (oder HEREDOCs) das ist ein Fehler. Der parser beschwert sich über die darin enthaltenen einzelnen zitiert
'string'
, weil es in der Regel erwartet, dass ein literal identifier /Schlüssel.Genauer gesagt es gilt zu verwenden PHP2-Stil einfache syntax, innerhalb von doppelten Anführungszeichen für array-Referenzen:
Verschachtelte arrays oder tiefer Objektreferenzen erfordern jedoch die komplexe curly string-Ausdruck syntax:
Wenn Sie unsicher sind, das ist allgemein sicherer, zu verwenden. Es wird oft auch als besser lesbar. Und bessere IDEs eigentlich eindeutige syntax-Einfärbung.
Fehlende Verkettung
Wenn ein string folgt ein Ausdruck, aber es fehlt eine Verkettung oder anderen Betreiber, dann wirst du sehen, PHP beschweren sich über das string-literal:
Während es offensichtlich für Sie und mich, PHP kann nicht nur denke, dass der string war gemeint angehängt werden, gibt es.
Verwirrend string-quote-Gehäuse
Den selben syntax Fehler tritt auf, wenn confounding string-Begrenzungszeichen. Ein string, angefangen von einem Einzelzimmer
'
- oder Doppelzimmer"
Zitat endet auch mit der gleichen.Dass Beispiel begann mit doppelten Anführungszeichen. Aber die doppelten Anführungszeichen waren auch bestimmt für die HTML-Attribute. Der vorgesehene operator innerhalb aber wurde interpretiert als Teil einer zweiten Zeichenkette in einfachen Anführungszeichen.
Dies ist ein gutes Beispiel, wo Sie sollten nicht zu brechen von doppelten Anführungszeichen in den ersten Platz. Stattdessen verwenden Sie einfach korrekte
\"
entweicht für die HTML-Attributen Anführungszeichen:Während dies kann auch dazu führen, syntax, Verwirrung, alles besser IDEs/Editoren wieder helfen, durch einfärben der escaped quotes anders.
Fehlende öffnung zitieren
Gleichwertig sind vergessen öffnende
"
/'
quotes ein Rezept für parser-Fehler:Hier die
', '
wäre ein string-literal nach ein bareword, wenn offensichtlichlogin
war dazu gedacht, einen string-parameter.Array-Listen
Wenn Sie vermissen eine
,
Komma in einem array-Erstellung-block, der parser wird in zwei aufeinander folgenden Zeichenfolgen:Beachten Sie, dass die Letzte Zeile immer enthalten ein zusätzliches Komma, aber mit Blick auf eine in zwischen ist unverzeihlich. Das ist schwer zu entdecken, ohne syntax-highlighting.
Funktion parameter-Listen
Gleiche für Funktionsaufrufe:
Runaway Streicher
Einer gemeinsamen Variante sind ganz einfach vergessen die string-Abschlusszeichen:
Hier PHP beschwert sich über zwei string-Literale direkt nach einander. Aber die eigentliche Ursache ist die nicht geschlossene vorherigen saite natürlich.
Siehe auch
InformationsquelleAutor
Unerwartete T_STRING
T_STRING
ist ein wenig irreführend. Es bezieht sich nicht auf einen zitierten"string"
. Es bedeutet eine raw-Identifikator festgestellt wurde. Dies kann vonbare
Worte übrig gebliebenenCONSTANT
oder Funktionsnamen, vergessen nicht gequotete strings, oder einem beliebigen text.Falsch zitiert Streicher
Dieser syntax-Fehler ist am häufigsten für falsch zitiert von string-Werten jedoch. Alle ohne Umschreibung und streunende
"
oder'
zitieren, bilden einen ungültigen Ausdruck:Syntax-highlighting machen solche Fehler super klar. Es ist wichtig, daran zu erinnern, zu verwenden backslashes zu escapen
\"
doppelten Anführungszeichen, oder\'
einfache Anführungszeichen - je nachdem, welche benutzt wurde, als string-Gehäuse."
Anführungszeichen gesetzt werden.echo
/print
Linien statt der Flucht in die und aus. Noch besser: betrachten Sie ein HEREDOC Abschnitt.Siehe auch Was ist der Unterschied zwischen einfachen Anführungszeichen und doppelten Anführungszeichen strings in PHP?.
Nicht geschlossene strings
Wenn Sie verpassen schließende
"
dann einen syntax-Fehler in der Regel materialisiert später. Eine nicht beendete Zeichenkette wird oft konsumieren, ein Stück code, der bis zum nächsten vorgesehenen string-Wert:Es ist nicht nur wörtlich
T_STRING
s, die der parser kann protestieren dann. Eine andere häufige Variante ist eineUnexpected '>'
für nicht in Anführungszeichen gesetzte wörtliche HTML.Non-Programmierung-string-Anführungszeichen
Wenn Sie kopieren und einfügen code aus einem blog oder eine website, die Sie manchmal am Ende mit Ungültiger code. Typografische Anführungszeichen sind nicht was PHP erwartet:
Typografische/smart quotes sind Unicode-Symbole. PHP behandelt Sie als Teil der angrenzenden alphanumerischen text. Zum Beispiel
”these
interpretiert als Konstante Bezeichner. Aber alle folgenden text-literal ist dann zu sehen, wie ein bareword/T_STRING durch den parser.Das fehlende Semikolon; auch
Wenn Sie ein nicht abgeschlossener Ausdruck in den vorangegangenen Zeilen, dann alle folgenden Anweisung oder sprachkonstrukt wird gesehen als raw-Kennung:
PHP kann einfach nicht wissen, wenn Sie gemeint für die Ausführung der beiden Funktionen nach dem anderen, oder wenn Sie meinte, sich zu vermehren, Ihre Ergebnisse, die Sie hinzufügen, zu vergleichen, oder nur ein
||
oder die andere.Short open tags und
<?xml
Header in PHP-SkriptenDies ist eher ungewöhnlich. Aber wenn short_open_tags aktiviert sind, dann können Sie nicht beginnen Sie Ihre PHP-Skripte mit einer XML-Deklaration:
PHP finden Sie in der
<?
und reklamieren es für sich. Es wird nicht verstehen, was die streunendenxml
bestimmt war. Werde es interpretiert als Konstante. Aber dieversion
wird gesehen als ein anderes literal/Konstante. Und da der parser kann nicht Sinn der zwei nachfolgenden Literale/Werte, ohne ein expression-operator in zwischen, das wird ein parser-Fehler.Unsichtbare Unicode-Zeichen
Eine grässliche Ursache für syntax-Fehler sind Unicode-Symbole, wie die non-breaking space. PHP erlaubt es Unicode-Zeichen als Bezeichner-Namen. Wenn Sie einen T_STRING-parser Beschwerde für ganz unverdächtigen-code wie:
Müssen Sie brechen aus einem anderen text-editor. Oder ein hexeditor auch. Was aussieht, wie schlichte Leerzeichen und Zeilenumbrüche hier können unsichtbare Konstanten. Java-basierte IDEs sind manchmal blind für eine UTF-8-BOM entstellten innerhalb, null-Breite Leerzeichen, Absatz-Separatoren, usw. Versuchen Sie, alles wieder Bearbeiten, entfernen Sie Leerzeichen, und fügen Sie die normalen Bereiche zurück.
Können Sie eingrenzen, mit mit dem hinzufügen von redundanten
;
statement-Separatoren in jeder Zeile beginnen:Extra
;
Semikolon hier konvertiert der vorhergehenden unsichtbaren Zeichen in eine Undefinierte Konstante Referenz (Ausdruck als Anweisung). Die im Gegenzug macht PHP erzeugen einen hilfreichen Hinweis.Das Zeichen `$` fehlt vor dem Namen der Variablen
Variablen in PHP dargestellt durch ein dollar-Zeichen gefolgt vom Namen der Variablen.
Dem dollar-Zeichen (
$
) ist ein Siegel, die Marken der Bezeichner als name einer Variablen. Ohne dieses Siegel, wird der Bezeichner könnte ein Sprache Schlagwort oder eine Konstante.Dies ist ein häufiger Fehler, wenn der PHP-code wurde "übersetzt" von code in einer anderen Sprache geschrieben (C, Java, JavaScript, usw.). In solchen Fällen ist eine Deklaration der Variablen Typ (wenn der original-code wurde geschrieben in einer Sprache, die verwendet typisierte Variablen), könnte auch aus dem Haus zu schleichen und diesen Fehler verursachen.
Entgangen Anführungszeichen
Wenn Sie
\
in eine Zeichenfolge, es hat eine Besondere Bedeutung. Dies nennt man eine "Escape-Zeichen" und in der Regel dem parser mitteilt, nehmen Sie das nächste Zeichen buchstäblich.Beispiel:
echo 'Jim said \'Hello\'';
druckenJim said 'hello'
Wenn Sie die schließende quote von einem string die schließenden Zitat wird wörtlich genommen werden und nicht, wie vorgesehen, D. H. als eine druckbare Zitat als Teil des Strings und nicht das Ende der Zeichenfolge. Dies wird zeigen, wie ein parse-Fehler Häufig nach dem öffnen der nächsten Zeichenfolge oder am Ende des Skripts.
Sehr häufiger Fehler bei der Angabe von Pfaden in Windows:
"C:\xampp\htdocs\"
ist falsch. Sie müssen"C:\\xampp\\htdocs\\"
.InformationsquelleAutor
Unerwartete
(
Öffnende Klammern in der Regel Folgen Sprachkonstrukte wie
if
/foreach
/for
/array
/list
oder starten Sie einen arithmetischen Ausdruck. Sie sind syntaktisch falsch, nach"strings"
Vorherige()
, ein einsamer$
, und in einigen typischen Erklärung zusammenhängen.Funktionsdeklaration Parameter
Einem selteneren auftreten dieser Fehler ist versuchen, zu verwenden Ausdrücke, die als Standard-Parameter Funktion. Dies wird nicht unterstützt, auch in PHP7:
Parameter in einer Funktion, die Erklärung kann nur Literale Werte oder Konstante Ausdrücke. Im Gegensatz zur Funktion aufrufen, wo Sie frei verwenden können
whatever(1+something()*2)
etc.Class-Eigenschaft standardmäßig
Gleiche Sache für Klasse Erklärungen, wo nur literal/Konstante Werte erlaubt sind, nicht Ausdrücken:
Setzen solche Dinge in den Konstruktor.
Siehe auch Warum nicht PHP-Parametern können Funktionen?
Wieder beachten Sie, dass PHP 7 erlaubt nur
var $xy = 1 + 2 +3;
Konstante Ausdrücke gibt.JavaScript-syntax in PHP
Mithilfe von JavaScript oder jQuery syntax funktioniert nicht in PHP aus offensichtlichen Gründen:
Wenn dies geschieht, gibt es in der Regel eine nicht beendete vorhergehenden Zeichenfolge; und wörtliche
<script>
undichte Abschnitte in den PHP-code Kontext.isset(()), leer, Taste, neben, aktuellen
Beide
isset()
undempty()
sind Sprache built-ins, keine Funktionen. Sie benötigen Zugriff auf eine variable direkt. Wenn Sie versehentlich hinzufügen, ein paar Klammern zu viel, dann würden Sie einen Ausdruck erstellen jedoch:Das gleiche gilt für jede Sprache zu bauen, erfordert implizite Variablennamen zugreifen. Diese built-ins sind Teil der Sprache, die Grammatik, daher nicht erlauben Dekorative zusätzlichen Klammern.
Benutzer-level-Funktionen, die erfordern, dass eine variable Referenz -erhalten aber das Ergebnis eines Ausdrucks übergeben - zu Laufzeitfehlern führen, statt.
Unerwartete
)
Abwesend-Funktion-parameter
Können Sie keine streunenden Kommas Letzte in einer Funktion aufrufen. PHP erwartet einen Wert gibt, und so beschwert sich über eine frühe Schließung
)
Klammer.Eine nachgestellte Komma ist nur erlaubt in
array()
oderlist()
Konstrukte.Unvollendete Ausdrücke
Wenn Sie vergessen, etwas in ein arithmetischer Ausdruck, dann ist der parser gibt. Denn wie sollte es möglicherweise zu interpretieren, dass:
Und wenn Sie vergessen haben, die Schließung
)
selbst, dann Sie bekommen würde, eine Beschwerde über die unerwartete Semikolon statt.Foreach als
constant
Für vergessen die variable
$
- Präfixe in control statements Sie werden sehen:PHP hier manchmal erzählt Sie es erwartet
::
statt. Da eine Klasse::$variable haben könnten, erfüllt die erwarteten $variable Ausdruck..Unerwartete
{
Geschweiften Klammern
{
und}
einschließen von code-Blöcken. Und syntax-Fehler über Ihnen in der Regel zeigen einige incorrec verschachteln.Unübertroffene Teilausdrücke in einer
if
Meist unsymmetrisch,
(
und)
sind die Ursache, wenn der parser beschwert sich über die öffnende geschweifte{
erscheinen zu früh. Ein einfaches Beispiel:Zählen Sie Ihre parens oder verwenden Sie eine IDE, die hilft. Auch nicht mit dem schreiben von code ohne Leerzeichen. Die Lesbarkeit zählt.
{ und } in expression Kontext
Können Sie nicht verwenden Sie geschweifte Klammern in Ausdrücken. Wenn Sie verwirren Klammern und curlys, die es nicht erfüllen, um die Sprache grammer:
Es gibt ein paar Ausnahmen für Bezeichner Konstruktion, wie die lokalen scope-variable
${references}
.Variable Variablen oder lockig var Ausdrücke
Das ist ziemlich selten. Aber Sie können auch
{
und}
parser Beschwerden für komplexe variable Ausdrücke:Obwohl es eine höhere Wahrscheinlichkeit für einen unerwarteten
}
in solchen Kontexten.Unerwartete
}
Bekommen, wenn eine "unerwartete
}
" Fehler, haben Sie meist geschlossen ist, wird ein code-block zu früh.Letzte Anweisung in einem code-block
Kann es passieren das für alle offen Ausdruck.
Und wenn die Letzte Zeile in eine Funktion/code-block fehlt ein abschließendes
;
Semikolon:Hier der parser kann nicht sagen, ob Sie vielleicht noch hinzufügen wollte
+ 25;
um das Ergebnis der Funktion oder etwas anderes.Ungültiger block nesting /Vergessen
{
Werden Sie manchmal sehen diese parser-Fehler, wenn ein code-block war
}
geschlossen zu früh, oder Sie haben vergessen eine öffnung{
auch:Im obigen Schnipsel der
if
hat nicht eine öffnung haben{
geschweiften Klammer. So ist die Schließung}
unten überflüssig geworden. Und damit die nächste schließen}
, die dazu gedacht war, die Funktion war nicht associatable der ursprünglichen Eröffnung{
geschweiften Klammer.Solche Fehler sind noch schwerer zu finden, ohne richtigen code-Einrückung. Die Verwendung eines IDE-und Klammer-matching.
Unerwartete
{
, erwartet(
Konstrukte in denen der Zustand/Erklärung header und einen code-block wird diesen Fehler auslösen.
Parameter-Listen
Beispielsweise misdeclared Funktionen ohne Parameterliste nicht erlaubt sind:
Control-Anweisung Bedingungen
Und können Sie nicht ebenfalls eine
if
ohne Bedingung.Welche nicht sinnvoll sind, ist offensichtlich. Das gleiche gilt für die üblichen verdächtigen,
for
/foreach
,while
/do
usw.Vielen Dank für Ihren Kommentar! Plattform-spezifische Zeilenumbrüche sind in der Tat ein ungewöhnliches und heikles Thema. Wahrscheinlich werde ich es zu erwähnen, in auch hier. (Es wurde nur erwähnt, dass neben dem Referenz-Antwort.)
Ich fand, dass immer Unerwartet } war, weil ein Stück von meinem code verwendet die php-short-Tags <? anstelle von <?php - nahm mich eine Weile, um zu finden, so arbeitete er auf anderen Servern.
InformationsquelleAutor
Unexpected $end
Wenn PHP spricht von einem "unerwarteten
$end
", es bedeutet, dass Ihr code wurde vorzeitig beendet. (Die Meldung ist ein wenig irreführend, wenn wörtlich genommen. Es geht nicht darum, eine variable namens "$Ende", wie manchmal angenommen wird, die von den Neulingen. Es bezieht sich auf das "Ende der Datei", EOF.)Es ist ziemlich immer über eine fehlende
}
geschweifte Klammer zu schließen obigen code-blocks.Wieder, verwenden Sie korrekte Einrückung zu vermeiden solche Probleme.
Verwendung eines IDE-mit Klammer-matching, um herauszufinden, wo die
}
nicht in Ordnung ist.Gibt es Tastatur-shortcuts in den meisten IDEs und Texteditoren:
Meisten IDEs auch highlight passenden Hosenträger, Klammern und Klammern.
Das macht es ziemlich einfach zu inspizieren und deren Zusammenhang:
Nicht Ausdrücken
Sowie
Unexpected $end
syntax/parser-Fehler kann auch auftreten, für ungekündigten Ausdrücke oder Aussagen:$var = func(1,
?>
EOFAlso schauen Sie am Ende des Skripts zuerst. Ein trailing
;
ist oft redundant für die Letzte Anweisung in jedem PHP-Skript. Aber Sie sollte haben. Gerade weil es verengt sich eine solche syntax nach unten.Eingerückt HEREDOC-Marker
Anderen alltäglich erscheint mit HEREDOC oder NOWDOC strings. Die abschließende Markierung geht ignoriert führende Leerzeichen, tabs, etc.:
Daher der parser übernimmt die HEREDOC-string weiter, bis das Ende der Datei (also "Unexpected $end"). So ziemlich alle IDEs und syntax-highlighting-Editoren machen dies offensichtlich oder warnen davor.
Entgangen Anführungszeichen
Wenn Sie
\
in eine Zeichenfolge, es hat eine Besondere Bedeutung. Dies nennt man eine "Escape-Zeichen" und in der Regel dem parser mitteilt, nehmen Sie das nächste Zeichen buchstäblich.Beispiel:
echo 'Jim said \'Hello\'';
druckenJim said 'hello'
Wenn Sie die schließende quote von einem string die schließenden Zitat wird wörtlich genommen werden und nicht, wie vorgesehen, D. H. als eine druckbare Zitat als Teil des Strings und nicht das Ende der Zeichenfolge. Dies wird zeigen, wie ein parse-Fehler Häufig nach dem öffnen der nächsten Zeichenfolge oder am Ende des Skripts.
Sehr häufiger Fehler bei der Angabe von Pfaden in Windows:
"C:\xampp\htdocs\"
ist falsch. Sie müssen"C:\\xampp\\htdocs\\"
.Alternative syntax
Etwas seltener sehen Sie diese syntax-Fehler bei der Verwendung der alternativen syntax für die Anweisung/code-Blöcke in den templates. Mit
if:
undelse:
und eine fehlendeendif;
zum Beispiel.Siehe auch:
InformationsquelleAutor
Unexpected T_IF
Unerwartete T_ELSEIF
Unexpected T_ELSE
Unerwartete T_ENDIF
Bedingte control blocks
if
,elseif
undelse
Folgen einem einfachen Aufbau. Wenn Sie auf einen syntax-Fehler, ist es wahrscheinlich nur Ungültiger block-Verschachtelungs - → mit fehlenden{
geschweiften Klammern}
- oder einer zuviel.Fehlt
{
oder}
durch falsche EinrückungNicht übereinstimmende code-Klammern sind Häufig weniger gut formatierten code wie:
Wenn Ihr code sieht so aus, beginnen von neuem! Sonst ist er unbehebbar, um Sie oder jemand anderes. Es gibt keinen Punkt, präsentiert diese im internet zu erkundigen, um Hilfe.
Werden Sie nur in der Lage, es zu beheben, wenn Sie können visuell Folgen die verschachtelte Struktur und die Beziehung der if/else-Bedingungen und Ihre
{
code-Blöcke}
. Verwenden Sie Ihre IDE, um zu sehen, wenn Sie sind alle gepaart.Alle Doppelzimmer
}
}
wird nicht nur in der Nähe eine Niederlassung, sondern einen früheren Zustand Struktur. Also stick mit einem coding-style; don ' T mix and match in verschachtelten if/else-Bäume.Abgesehen von der Konsistenz hier, es stellt sich heraus hilfreich, um zu vermeiden langwierige Bedingungen zu. Die Verwendung von temporären Variablen oder Funktionen zu vermeiden, nicht lesbare
if
-Ausdrücke.IF
können nicht in Ausdrücken verwendet werdenEine überraschend häufige Neuling Fehler versucht eine
if
- Anweisung in einem Ausdruck, wie etwa eine print-Anweisung:Die ungültig ist natürlich.
Können Sie ein ternärer bedingte, aber achten Sie auf die Lesbarkeit Auswirkungen.
Sonst brechen solche output-Konstrukte: verwenden mehrere
if
undecho
s.Besser noch, verwenden Sie temporäre Variablen, und legen Sie Ihre Bedingungen vor:
Definition von Funktionen oder Methoden, die für solche Fälle oft sinnvoll auch.
Control blocks nicht wieder "Ergebnisse"
Nun ist dies weniger Häufig, aber ein paar Programmierer selbst versuchen zu behandeln
if
als wenn er zurückkehren könnte, eine Ergebnis:Ist strukturell identisch mit
if
innerhalb einer string-Verkettung /Ausdruck.Haben Sie eine Zuweisung im code-block:
Alternativ resort zu einem
?:
ternär-Vergleich.Wenn, Wenn
Du nicht nest ein
if
innerhalb einer Bedingung entweder:Ist offensichtlich redundant, da die
and
(oderor
) lässt bereits die Verkettung Vergleiche.Vergessene
;
SemikolonsEinmal mehr: Jede control-block benötigt, um eine Anweisung. Wenn der Vorherige code-Stück nicht mit einem Semikolon abgeschlossen, dann ist das garantiert ein syntax-Fehler:
Btw, die Letzte Zeile in einer
{…}
code-Blocks muss ein Semikolon zu.Semikolon zu früh
Nun, es ist wahrscheinlich falsch, die Schuld einer bestimmten Kodierung der Art, wie diese Falle ist auch leicht zu übersehen:
Und das passiert öfter als man sich vorstellen kann.
if ()
- Ausdruck durch;
Sie ausgeführt wird, eine leere Anweisung. Die;
wird eine leere{}
!{…}
block ist somit losgelöst von derif
, und würde immer laufen.else
keine mehr hatte, eine Beziehung zu einem offenenif
konstruieren,das ist der Grund, warum dies würde dazu führen, dass ein Unerwartetes T_ELSE syntax-Fehler.
Was auch erklärt, eine ebenso subtile Variante dieser syntax error:
Wo die
;
nach dem code-block{…}
beendet die ganzeif
konstruieren, durchtrennen des
else
Zweig syntaktisch.Nicht mit code-Blöcke
Es syntaktisch erlaubt das weglassen von geschweiften Klammern
{
...}
für code-Blöcke inif
/elseif
/else
Zweige. Die Antwort ist leider ein syntax-Stil sehr Häufig zu unversed Programmierer. (Unter der falschen Annahme, dieser war schneller zu Tippen oder zu Lesen).Jedoch ist es sehr wahrscheinlich, Reise auf die syntax. Früher oder später weitere Aussagen finden Ihren Weg in die if/else-Zweige:
Aber tatsächlich verwenden Sie code-Blöcke, Sie tun haben zu schreiben
{
...}
Sie als solche!Else /Elseif in der falschen Reihenfolge
Eine Sache, um sich daran zu erinnern ist die bedingte Bestellung, natürlich.
Können Sie so viele
elseif
s, wie Sie wollen, aberelse
zu fahren hat Letzte. Das ist, wie es ist.Klasse Erklärungen
Als oben erwähnt, können Sie nicht die Kontrolle haben Aussagen in der Deklaration einer Klasse:
Du entweder habe ein Funktion definition, oder geschlossen eine
}
zu früh in solchen Fällen.Unerwartete T_ELSEIF /T_ELSE
Beim mischen von PHP und HTML, die Schließung
}
für eineif/elseif
müssen in der gleichen PHP-block<?php ?>
als die nächsteelseif/else
. Dies wird einen Fehler generieren, als die Schließung}
für dieif
muss ein Teil derelseif
:Die richtige form
<?php } elseif
:Dies ist mehr oder weniger eine variation der falsche Einrückung - vermutlich oft auf falsche Codierung Absichten.
Sie können nicht Brei weitere Anweisungen dazwischen
if
undelseif
/else
strukturelle Token:Entweder kann nur auftreten, in
{…}
code-Blöcke, nicht zwischen Kontroll-Struktur Token.if
undelse
Zweige.Noch können Sie Teil eine if/else - zwischen verschiedenen Kontrollstrukturen:
Gibt es keine syntaktische relation zwischen den
if
undelse
. Dieforeach
lexikalischen Gültigkeitsbereich endet am}
, so gibt es keinen Punkt für dieif
Struktur, um fortzufahren.T_ENDIF
Wenn eine unerwartete T_ENDIF ist, beschwert sind, verwenden Sie die alternative syntax der Stil
if:
⋯elseif:
⋯else:
⋯endif;
. Das sollten Sie wirklich zweimal überlegen.Ein häufiger Fehler ist die Verwechslung der unheimlich ähnlich wie
:
Doppelpunkt für eine;
Semikolon. (Siehe "Semikolon zu früh")Als Einrückung ist schwieriger zu verfolgen, in den template-Dateien, die mehr bei der Verwendung der alternativen syntax - es plausibel, Ihre
endif;
entsprechen keinerif:
.Mit
} endif;
ist ein verdoppelt
if
-terminator.Während ein "unexpected $end" ist in der Regel der Preis für eine vergessene schließende
}
geschweiften Klammer.Zuordnung vs. Vergleich
So, das ist kein syntax-Fehler, aber erwähnenswert in diesem Zusammenhang:
Ist das nicht ein
==
/===
Vergleich, aber einen=
Zuordnung. Dies ist eher subtil, und wird leicht dazu führen, dass einige Benutzer hilflos Bearbeiten ganze blockiert. Watch out für unbeabsichtigte Zuordnungen ersten whenver Sie erleben ein Logik-Fehler /misbeheviour.InformationsquelleAutor
Unexpected T_IF
Unerwartete T_FOREACH
Unerwartete T_FOR
Unerwartete T_WHILE
Unerwartete T_DO
Unexpected T_ECHO
Kontrollstrukturen wie
if
,foreach
,for
,while
,list
,global
,return
,do
,print
,echo
kann nur verwendet werden, Aussagen. Sie in der Regel befinden sich auf einer Linie von selbst.Semikolon; wo man an?
Ziemlich überall haben Sie verpasst ein Semikolon in der vorherigen Zeile, wenn der parser beschwert sich über ein Steuerelement-Anweisung:
Lösung: suchen Sie in der vorherigen Zeile; fügen Sie das Semikolon.
Klasse Erklärungen
Einem anderen Ort, wo dies geschieht, ist in der Klasse Erklärungen. In der Klasse-Bereich können Sie nur die Eigenschaft list Initialisierungen und Methode Abschnitte. Ohne code kann dort wohnen.
Solche syntax-Fehler Häufig eintreten für falsch verschachtelte
{
und}
. Insbesondere, wenn die Funktion code-Blöcke habe zu früh geschlossen.Aussagen im Ausdruck Kontext
Meisten Sprachkonstrukte können nur als Aussagen. Sie sind nicht dazu da, um in andere Ausdrücke:
Ebenso können Sie nicht verwenden, eine
if
in strings, mathematische Ausdrücke oder anderswo:Für die Einbettung
if
-ähnlichen Bedingungen in einem Ausdruck explizit, die Sie oft benutzen wollen,?:
ternären Auswertung.Gleiches gilt für
for
,while
,global
,echo
- und in geringerem Ausmaßlist
.In der Erwägung, dass
print()
ist eine Sprache vordefiniert, die verwendet werden können in expression Kontext. (Aber nur selten Sinn macht.)Reservierten Schlüsselwörter als Bezeichner
Du auch nicht verwenden können
do
oderif
und andere Sprachkonstrukte für Benutzer-definierte Funktionen oder Klassennamen. (Vielleicht in PHP7. Aber selbst dann würde es nicht ratsam sein.)InformationsquelleAutor
Unerwartete T_IS_EQUAL
Unerwartete T_IS_GREATER_OR_EQUAL
Unerwartete T_IS_IDENTICAL
Unerwartete T_IS_NOT_EQUAL
Unerwartete T_IS_NOT_IDENTICAL
Unerwartete T_IS_SMALLER_OR_EQUAL
Unerwartete
<
Unerwartete
>
Vergleichsoperatoren wie
==
,>=
,===
,!=
,<>
,!==
und<=
oder<
und>
meist sollte verwendet werden, nur in Ausdrücken, wieif
Ausdrücken. Wenn der parser beschwert sich über Sie, dann bedeutet das Häufig, dass falsche Gemüsemesser oder nicht(
)
parens um Sie herum.Parens Gruppierung
Insbesondere für
if
Aussagen mit mehrere Vergleiche müssen Sie darauf achten, richtig zu zählen öffnende und schließende Klammer:Hier die
if
Bedingung hier war bereits beendet, indem der)
Einmal Ihre Vergleiche werden ausreichend Komplex oft hilft es, es aufgeteilt in mehrere und verschachtelte
if
Konstrukte eher.isset() Kartoffelpüree mit vergleichen
Einer gemeinsamen Neuling ist pitfal versucht zu kombinieren
isset()
oderempty()
mit vergleichen:Oder auch:
Ist dies nicht sinnvoll auf PHP, weil
isset
undempty
sind Konstrukte, die nur akzeptieren Variablennamen. Es macht keinen Sinn, das Resultat zu vergleichen, denn der Ausgang ist nur/schon ein boolean.Verwirrend
>=
größer-oder-gleich mit=>
array-operatorBeiden Operatoren sehen etwas ähnlich aus, so dass Sie manchmal Durcheinander:
Brauchen Sie nur daran zu erinnern, dass dieser Vergleichsoperator wird aufgerufen, "größer als oder gleich" es richtig zu machen.
Siehe auch: If-Anweisung Struktur in PHP
Nichts zu vergleichen gegen
Kann man auch nicht kombinieren Sie zwei Vergleiche, wenn Sie sich die gleiche variable name:
PHP kann nicht folgern, dass Sie gemeint ist zu vergleichen die ursprüngliche variable wieder. Ausdrücke sind in der Regel gepaart nach operator-Rangfolge, so dass durch die Zeit der
<
gesehen wird, es wäre nur ein boolean-Resultat Links von der ursprünglichen Variablen.Siehe auch: unerwartete T_IS_SMALLER_OR_EQUAL
Vergleich Ketten
Kann man nicht vergleichen, die gegen eine variable mit einer Reihe von Operatoren:
Diese werden aufgeteilt in zwei vergleichen, jeder gegen jeden
$x
.Dies ist eigentlich mehr ein Fall von schwarze Liste von Ausdrücken (durch äquivalente operator-Assoziativität). Es ist syntaktisch gültig, die in ein paar C-style Sprachen, aber PHP würde das nicht so interpretieren erwarteten Vergleich Kette.
Unerwartete
>
Unerwartete
<
Die größer als
>
oder weniger als<
Betreiber nicht über eine benutzerdefinierteT_XXX
tokenizer Namen. Und während Sie kann verlegt werden wie alle anderen, Sie öfter zu sehen, der parser beschweren sich darüber, falsch zitiert Streicher und püriert HTML:Dieser beträgt string
"<a href='z"
im Vergleich>
um eine Literale KonstanteHello
und dann noch<
Vergleich. Oder zumindest, wie PHP sieht. Die eigentliche Ursache und syntax Fehler war, den vorzeitigen string"
Kündigung.Ist es auch nicht möglich zu verschachteln, PHP-start-tags:
Siehe auch:
InformationsquelleAutor
Unexpected '?'
Wenn Sie versuchen, verwenden Sie die null-coalescing operator
??
in einer PHP-version vor PHP 7, erhalten Sie diese Fehlermeldung.Unexpected '?', erwarten variable
Einen ähnlichen Fehler kann auftreten, für nullable-Typen, in:
Das deutet wieder auf eine veraltete PHP-version benutzt wird (entweder die CLI-version
php -v
oder den webserver gebunden einephpinfo();
).InformationsquelleAutor
Unexpected T_LNUMBER
Token
T_LNUMBER
bezieht sich auf eine "lange" /Anzahl.Ungültige Variablennamen
In PHP, und die meisten anderen Programmiersprachen, Variablen nicht mit einer Zahl beginnen. Das erste Zeichen muss jedoch ein Buchstabe oder ein Unterstrich.
Oft kommt für die Verwendung
preg_replace
-Platzhalter"$1"
im PHP-Kontext:Wo der Rückruf sollte, sind bereits zitiert worden. (Jetzt die
/e
regex-flag ist veraltet. Aber es ist manchmal immer noch missbrauchtpreg_replace_callback
Funktionen.)Dem gleichen Bezeichner-Einschränkung gilt für Objekt-Eigenschaften, btw.
Während der tokenizer/parser nicht erlauben, eine wörtliche
$1
als Variablen-Namen, eine könnte Verwendung${1}
oder${"1"}
. Das ist eine syntaktische workaround für nicht-standard-IDS. (Es ist am besten zu denken, dass es einen lokalen Bereich suchen. Aber im Allgemeinen: lieber plain-arrays für solche Fälle!)Lustig, aber sehr viel ist nicht zu empfehlen, der PHP parser erlaubt auch Unicode-Bezeichner; solche, die
$➊
wäre gültig. (Im Gegensatz zu einer wörtlichen1
).Streunenden array-Eintrag
Einer unerwartet langen können auch auftreten, für array-Deklarationen - wenn fehlende
,
Kommas:Oder auch Funktionsaufrufe und Deklarationen und andere Konstrukte:
func(1, 2 3);
function xy($z 2);
for ($i=2 3<$z)
Also in der Regel gibt es
;
oder,
fehlt für die Trennung von Listen oder Ausdrücke.Falsch zitiert HTML -
Wieder, falsch zitiert strings sind eine häufige Quelle von streunenden zahlen:
Solche Fälle behandelt werden sollen, mehr oder weniger wie Unerwartete T_STRING Fehler.
Andere Identifikatoren
Weder Funktionen, Klassen, noch namespaces können benannt werden, beginnend mit einer Reihe entweder:
So ziemlich das gleiche wie für Variablennamen.
InformationsquelleAutor
Unexpected '='
Dies kann verursacht werden durch ungültige Zeichen in einem Variablennamen. Variablen-Namen muss folgende Regeln zu beachten:
InformationsquelleAutor
Unerwartete "weiter" (T_CONTINUE)
continue
ist eine Aussage (like-for-oder if) und erscheinen müssen, standalone. Es kann nicht verwendet werden, als Teil eines Ausdrucks. Teilweise, weil weiterhin nicht einen Wert zurückgeben, aber in einem Ausdruck jedes sub-expression führen muss etwas Wert, so dass der gesamte Ausdruck als Ergebnis den Wert. Das ist der Unterschied zwischen einer Anweisung und einem Ausdruck.Das bedeutet, dass
continue
kann nicht verwendet werden, die in einem ternären-Anweisung oder eine Anweisung, erfordert einen return-Wert.Unerwartete "break" (T_BREAK)
Gleiche gilt für
break;
natürlich. Es ist auch nicht verwendbar in Ausdruck Kontext, aber eine strenge Anweisung (auf der gleichen Ebene wieforeach
oder eineif
block).Unerwartete "Rückkehr" (T_RETURN)
Nun, das könnte mehr überraschend für
return
, aber das ist auch nur ein block-level - Anweisung. Es hat einen Wert zurückgeben (oder NULL), um den höheren Bereich/Funktion, aber es nicht bewerten, wie der Ausdruck selbst. → Das heißt: es macht keinen Sinnreturn(return(false);;
InformationsquelleAutor
Unexpected 'endwhile' (T_ENDWHILE)
Die syntax ist die Verwendung eines Doppelpunkt - wenn es kein Doppelpunkt die oben genannten Fehler auftreten,
Alternative syntax mit geschweiften Klammern
http://php.net/manual/en/control-structures.while.php
InformationsquelleAutor