it-swarm.com.de

PHP Analyse-/Syntaxfehler; und wie löse ich sie?

Jeder stößt auf Syntaxfehler. Sogar erfahrene Programmierer machen Tippfehler. Für Neuankömmlinge ist dies nur ein Teil des Lernprozesses. Es ist jedoch oft einfach, Fehlermeldungen wie die folgenden zu interpretieren:

PHP Parse-Fehler: Syntaxfehler, unerwartetes "{" in index.php in Zeile 20

Das unerwartete Symbol ist nicht immer der eigentliche Schuldige. Aber die Zeilennummer gibt Ihnen eine ungefähre Idee, wo Sie anfangen sollen.

Schauen Sie sich immer den Code-Kontext an. Der Syntaxfehler versteckt sich häufig in den erwähnten oder in vorherigen Codezeilen. Vergleichen Sie Ihren Code mit den Syntaxbeispielen aus dem Handbuch.

Während nicht jeder Fall zum anderen passt. Es gibt jedoch einige allgemeine Schritte zum Lösen von Syntaxfehlern . Diese Referenzen fassen die gängigen Fallstricke zusammen:

Nah verwandte Referenzen:

Und:

Stack Overflow ist zwar auch für Anfänger geeignet, richtet sich aber meist an professionelle Programmierfragen.

  • Die Beantwortung aller Codierungsfehler und der engen Tippfehler gilt als meistens nicht als Thema.
  • Nehmen Sie sich daher die Zeit, um die grundlegenden Schritte zu befolgen, bevor Sie Syntax-Fixierungsanforderungen senden.
  • Wenn Sie immer noch müssen, zeigen Sie bitte Ihre eigene Lösungsinitiative, Lösungsversuche und Ihre Gedanken darüber, was aussieht oder falsch sein könnte.

Wenn in Ihrem browser Fehlermeldungen wie "SyntaxError: unzulässiges Zeichen" angezeigt werden, handelt es sich nicht um php -, sondern um ein javascript - Syntaxfehler . _.


Syntaxfehler bei Herstellercode ausgelöst: Schließlich sollten Sie berücksichtigen, dass der Syntaxfehler nicht durch Bearbeiten der Codebase ausgelöst wurde, sondern nach der Installation oder dem Upgrade eines externen Herstellerpakets auf Inkompatibilität der Version PHP, Überprüfen Sie daher die Anforderungen des Anbieters anhand Ihrer Plattformeinrichtung.

555
mario

Was sind die Syntaxfehler?

PHP gehört zu den Programmiersprachen C-style und imperative . Es gibt starre Grammatikregeln, die nicht wiederhergestellt werden können, wenn falsch platzierte Symbole oder Bezeichner gefunden werden. Es kann Ihre Codierungsabsichten nicht erraten.

Function definition syntax abstract

Wichtigste Tipps

Es gibt ein paar grundlegende Vorsichtsmaßnahmen, die Sie immer treffen können:

  • Verwenden Sie die richtige Codeeinrückung, oder übernehmen Sie einen hohen Codierungsstil. Lesbarkeit verhindert Unregelmäßigkeiten.

  • Verwenden Sie ein IDE oder einen Editor für PHP mit Syntaxhervorhebung. Das hilft auch beim Auswuchten von Klammern/Klammern.

    Expected: semicolon

  • Lesen Sie die Sprachreferenz und Beispiele im Handbuch. Zweimal, um einigermaßen kompetent zu werden.

Wie man Parserfehler interpretiert

Eine typische Syntaxfehlermeldung lautet:

Parse-Fehler: Syntaxfehler, unerwartet T_STRING, erwartet ';' in file.php in Zeile 217 ​​

Welche listet die mögliche Position eines Syntaxfehlers. Siehe die erwähnten Dateiname und Zeilennummer.

Ein Moniker wie T_STRING erklärt, welches Symbol der Parser/Tokenizer endgültig nicht verarbeiten konnte. Dies ist jedoch nicht unbedingt die Ursache für den Syntaxfehler.

Es ist wichtig, auch in vorherige Codezeilen zu schauen. 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.

Beheben von Syntaxfehlern

Es gibt viele Ansätze, um Syntaxprobleme einzugrenzen und zu beheben.

  • Öffnen Sie die erwähnte Quelldatei. Schauen Sie sich die erwähnte Codezeile an.

    • Bei außer Kontrolle geratenen Zeichenfolgen und verlegten Operatoren ist dies normalerweise der Ort, an dem Sie den Schuldigen finden.

    • Lesen Sie die Zeile von links nach rechts und stellen Sie sich vor, was die einzelnen Symbole bewirken.

  • Regelmäßiger müssen Sie sich auch vorherige Zeilen ansehen.

    • Insbesondere fehlen ;-Semikolons am Ende der vorherigen Zeile/Anweisung. (Zumindest aus stilistischer Sicht.)

    • Wenn {-Codeblöcke } falsch geschlossen oder verschachtelt sind, müssen Sie den Quellcode möglicherweise noch weiter untersuchen. Verwenden Sie einen geeigneten Codeeinzug , um dies zu vereinfachen.

  • Schauen Sie sich die Syntax Kolorierung!

    • Zeichenfolgen, Variablen und Konstanten sollten alle unterschiedliche Farben haben.

    • Die Operatoren +-*/. sollten ebenfalls unterschiedlich eingefärbt sein. Andernfalls befinden sie sich möglicherweise im falschen Kontext.

    • Wenn Sie feststellen, dass sich die Zeichenfolgenfärbung zu weit oder zu kurz erstreckt, haben Sie eine "- oder '-Abschlusszeichenfolge gefunden.

    • Wenn zwei gleichfarbige Interpunktionszeichen nebeneinander stehen, kann dies ebenfalls zu Problemen führen. Normalerweise sind Operatoren allein, wenn sie keinem Operator ++, -- oder Klammern folgen. Zwei direkt aufeinander folgende Zeichenfolgen/Bezeichner sind in den meisten Kontexten falsch.

  • Leerzeichen ist dein Freund. Folgen Sie jedem Codierungsstil.

  • Brechen Sie lange Schlangen vorübergehend auf.

    • Sie können zwischen Operatoren oder Konstanten und Zeichenfolgen frei Zeilenumbrüche hinzufügen. Der Parser konkretisiert dann die Zeilennummer für Analysefehler. Anstatt den sehr langen Code zu betrachten, können Sie das fehlende oder falsch platzierte Syntaxsymbol isolieren.

    • Teilen Sie komplexe ifname__-Anweisungen in unterschiedliche oder verschachtelte ifname__-Bedingungen auf.

    • Verwenden Sie anstelle langwieriger mathematischer Formeln oder logischer Ketten temporäre Variablen, um den Code zu vereinfachen. (Mehr lesbar = weniger Fehler.)

    • Hinzufügen von Zeilenumbrüchen zwischen:

      1. Den Code, den Sie leicht als richtig identifizieren können,
      2. Die Teile, bei denen Sie sich nicht sicher sind,
      3. Und die Zeilen, über die sich der Parser beschwert.

      Das Aufteilen langer Codeblöcke hilft wirklich , den Ursprung von Syntaxfehlern zu lokalisieren.

  • Auskommentieren Beleidigender Code.

    • Wenn Sie die Problemquelle nicht isolieren können, können Sie Codeblöcke auskommentieren (und damit vorübergehend entfernen).

    • 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 lösen können, versuchen Sie mschreiben die auskommentierten Abschnitte von Grund auf ne.

  • 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 einfache ifname__-Anweisungen, während Sie nicht vertauscht sind.

    • Die alternative Syntax von PHP (if:/elseif:/endif;) ist für Vorlagen üblich, aber vermutlich weniger einfach zu befolgen als normale {-Code }-Blöcke.

  • Die häufigsten Newcomer-Fehler sind:

    • Fehlende Semikolons ; zum Beenden von Anweisungen/Zeilen.

    • Nicht übereinstimmende Zeichenfolgen-Anführungszeichen für " oder ' und nicht umgebrochene Anführungszeichen in.

    • Vergessene Operatoren, insbesondere für die Verkettung der Zeichenfolge ..

    • Unsymmetrische (-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 dafür sorgen, dass ein Problem beseitigt wird, andere Probleme jedoch in einem der folgenden Codes auftreten, sind Sie meist auf dem richtigen Weg.

    • Wenn nach dem Bearbeiten eines neuen Syntaxfehlers in derselben Zeile ein Fehler auftritt, ist der Änderungsversuch möglicherweise fehlgeschlagen. (Nicht immer.)

  • Stellen Sie eine Sicherungskopie des zuvor funktionierenden Codes wieder her, wenn Sie diese nicht reparieren können.

    • Nehmen Sie ein Versionssystem für den Quellcode an. Sie können immer einen diffder defekten und letzten funktionierenden Version anzeigen. Welches ist vielleicht aufschlussreich, was das Syntaxproblem ist.
  • Invisible stray Unicode characters: In einigen Fällen müssen Sie einen Hexeditor verwenden oder einen anderen Editor/Viewer für Ihre Quelle. Einige Probleme lassen sich nicht allein anhand Ihres Codes feststellen.

    • Versuchen Sie grep --color -P -n "\[\x80-\xFF\]" file.php als erste Maßnahme, um Nicht-ASCII-Symbole zu finden.

    • Insbesondere Stücklisten, Leerzeichen mit oder ohne Zeilenumbruch und intelligente Anführungszeichen können regelmäßig Eingang in den Quellcode finden.

  • Achten Sie darauf, welche Arten von Zeilenumbrüchen in Dateien gespeichert werden.

    • PHP ehrt gerade \n Zeilenumbrüche nicht \r Wagenrücklauf.

    • Dies ist gelegentlich ein Problem für MacOS-Benutzer (sogar unter OS X für falsch konfigurierte Editoren).

    • Es taucht häufig nur dann 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 Ihr Computer einen Syntaxfehler aufweist. Die gleiche Datei online zu stellen, zeigt sie jedoch nicht mehr. Was nur eines von zwei Dingen bedeuten kann:

    • Sie sehen die falsche Datei!

    • Oder Ihr Code enthielt unsichtbaren Unicode (siehe oben). Sie können 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 denjenigen, der über den Webserver aufgerufen wurde.


    Das muss nicht dasselbe sein. Insbesondere wenn Sie mit Frameworks arbeiten, werden Sie diese aufeinander abstimmen.

  • Verwenden Sie PHPs reservierte Schlüsselwörter 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 immer google Ihre Fehlermeldung. Syntaxsymbole sind nicht so einfach zu suchen (Stack Overflow selbst wird durch SymbolHound obwohl indiziert). Daher kann es einige weitere Seiten dauern, bis Sie etwas Relevantes finden.

Weitere Anleitungen:

Weißer Bildschirm des Todes

Wenn Ihre Website nur leer ist, ist in der Regel ein Syntaxfehler 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 .user.ini mit FastCGI-Setups.

Die Aktivierung innerhalb des fehlerhaften Skripts ist zu spät, da PHP nicht einmal die erste Zeile interpretieren/ausführen kann. Eine schnelle Problemumgehung ist das Erstellen eines Wrapper-Skripts, beispielsweise test.php:

<?php
   error_reporting(E_ALL);
   ini_set("display_errors", 1);
   include("./broken-script.php");

Rufen Sie dann den fehlerhaften Code auf, indem Sie auf dieses Wrapper-Skript zugreifen.

Es hilft auch, den error_log von PHP zu aktivieren und den error.log Ihres Webservers zu überprüfen , wenn ein Skript mit HTTP 500-Antworten abstürzt.

268
mario

Ich denke, dieses Thema ist völlig überarbeitet/zu kompliziert. Die Verwendung einer IDE ist DER Weg, um Syntaxfehler vollständig zu vermeiden. Ich würde sogar sagen, dass das Arbeiten ohne IDE irgendwie unprofessionell ist. Warum? Weil moderne IDEs Ihre Syntax nach jedem eingegebenen Zeichen überprüfen. Wenn Sie kodieren und Ihre gesamte Zeile rot wird, und ein großer Warnhinweis auf den genauen Typ und die genaue Position des Syntaxfehlers hinweist, besteht keine Notwendigkeit, nach einer anderen Lösung zu suchen.

Die Verwendung einer Syntaxprüfung IDE bedeutet:

Sie werden (effektiv) nie wieder mit Syntaxfehlern konfrontiert, nur weil Sie sie bei der Eingabe richtig sehen. Ernst.

Hervorragende IDEs mit Syntaxprüfung (alle sind für Linux, Windows und Mac verfügbar):

  1. NetBeans [kostenlos]
  2. PHPStorm [$ 199 USD]
  3. Eclipse mit PHP Plugin [kostenlos]
  4. Sublime [$ 80 USD] (hauptsächlich Texteditor, aber erweiterbar mit Plugins wie PHP Syntax Parser )
99
Sliq

Unerwartet [

Heutzutage ist die unerwartete [ - Array-Klammer häufig in veralteten PHP) - Versionen zu finden. Die kurze Array-Syntax ist verfügbar seit PHP > = 5.4 Ältere Installationen unterstützen nur array().

$php53 = array(1, 2, 3);
$php54 = [1, 2, 3];
         ⇑

Die Dereferenzierung der Array-Funktionsergebnisse ist ebenfalls für ältere PHP Versionen nicht verfügbar:

$result = get_whatever()["key"];
                      ⇑

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 prüfen, ob beispielsweise SetHandler php56-fcgi Verwendet werden kann, um eine neuere Laufzeit zu aktivieren.

Siehe auch:

Übrigens gibt es auch Präprozessoren und PHP 5.4-Syntax-Abwärtskonverter wenn Sie wirklich mit älteren + langsameren PHP) Versionen klammern.

Andere Ursachen für Unerwartete [ Syntaxfehler

Wenn es sich nicht um die Nichtübereinstimmung der PHP Version handelt, handelt es sich häufig um einen Tippfehler oder einen Newcomer-Syntaxfehler:

  • Sie können Deklarationen/Ausdrücke von Array-Eigenschaften in Klassen nicht verwenden, auch nicht in PHP 7.

    protected $var["x"] = "Nope";
                  ⇑
    
  • Das Verwechseln von [ Mit öffnenden geschweiften Klammern { Oder runden Klammern ( Ist ein häufiges Versehen.

    foreach [$a as $b)
            ⇑
    

    Oder auch:

    function foobar[$a, $b, $c] {
                   ⇑
    
  • Oder versuchen Sie Konstanten (vor PHP 5.6)) als Arrays zu dereferenzieren:

    $var = const[123];
           ⇑
    

    Zumindest PHP interpretiert const als konstanten Namen.

    Wenn Sie auf eine Array-Variable zugreifen möchten (was hier die typische Ursache ist), fügen Sie das führende $ - Siegel hinzu, sodass es zu einem $varname Wird.

  • Sie versuchen, das Schlüsselwort global für ein Mitglied eines assoziativen Arrays zu verwenden. Dies ist keine gültige Syntax:

    global $var['key'];
    


Unerwartete ] Schließen eckige Klammer

Dies ist etwas seltener, aber es gibt auch Syntaxunfälle mit der abschließenden Array-Klammer ].

  • Wiederum kommt es häufig zu Nichtübereinstimmungen mit ) - Klammern oder } - geschweiften Klammern:

    function foobar($a, $b, $c] {
                              ⇑
    
  • Oder versuchen Sie, ein Array zu beenden, in dem es keines gibt:

    $var = 2];
    

    Was häufig in mehrzeiligen und verschachtelten Array-Deklarationen vorkommt.

    $array = [1,[2,3],4,[5,6[7,[8],[9,10]],11],12]],15];
                                                 ⇑
    

    In diesem Fall verwenden Sie IDE für die Klammerzuordnung, um einen vorzeitigen Array-Abschluss ] Zu finden. Verwenden Sie mindestens mehr Abstände und Zeilenumbrüche, um ihn einzugrenzen.

57
mario

Unerwartetes T_VARIABLE

Ein "unerwarteter T_VARIABLE" bedeutet, dass es einen literalen $variable-Namen gibt, der nicht in die aktuelle Ausdrucks-/Anweisungsstruktur passt.

purposefully abstract/inexact operator+$variable diagram

  1. Fehlendes Semikolon

    Am häufigsten wird in der vorherigen Zeile ein fehlendes Semikolon angezeigt. Variablenzuweisungen nach einer Anweisung sind ein guter Indikator, wo sie suchen müssen:

           ⇓
    func1()
    $var = 1 + 2;     # parse error in line +2
    
  2. String-Verkettung

    Ein häufiges Missgeschick ist String-Verkettungen mit vergessenem .-Operator:

                                   ⇓
    print "Here comes the value: "  $value;
    

    Übrigens sollten Sie Zeichenketteninterpolation (grundlegende Variablen in Anführungszeichen) vorziehen, wenn dies die Lesbarkeit verbessert. Dadurch werden diese Syntaxprobleme vermieden.

    Die Zeichenketteninterpolation ist eine Kernfunktion der Skriptsprache. Keine Schande, es zu nutzen. Ignorieren Sie alle Hinweise zur Mikrooptimierung, wenn die Verkettung der Variablen .schneller ist. Es ist nicht.

  3. Fehlende Ausdrucksoperatoren

    Natürlich kann das gleiche Problem auch bei anderen Ausdrücken auftreten, beispielsweise bei arithmetischen Operationen:

               ⇓
    print 4 + 7 $var;
    

    PHP kann hier nicht raten, wenn die Variable hinzugefügt, subtrahiert oder verglichen werden soll usw.

  4. Listen

    Das Gleiche gilt für Syntaxlisten wie in Array-Populationen, bei denen der Parser auch ein erwartetes Komma , angibt, zum Beispiel:

                                          ⇓
    $var = array("1" => $val, $val2, $val3 $val4);
    

    Oder Funktionsparameterlisten:

                                    ⇓
    function myfunc($param1, $param2 $param3, $param4)
    

    Äquivalent sehen Sie dies mit list- oder global-Anweisungen oder wenn ein ;-Semikolon in einer for-Schleife fehlt.

  5. Klassenerklärungen

    Dieser Parser-Fehler tritt auch in Klassendeklarationen auf. Sie können nur statische Konstanten zuweisen, keine Ausdrücke. So beschwert sich der Parser über Variablen als zugewiesene Daten:

    class xyz {      ⇓
        var $value = $_GET["input"];
    

    Hier können insbesondere ungenaue } schließende geschweifte Klammern führen. Wenn eine Methode zu früh beendet wird (richtige Einrückung verwenden!), Wird eine Streuvariable normalerweise in den Klassendeklarationskörper falsch eingefügt.

  6. Variablen nach Bezeichnern

    Sie können auch niemals eine Variable folgt einem Bezeichner direkt haben:

                 ⇓
    $this->myFunc$VAR();
    

    Übrigens, dies ist ein allgemeines Beispiel, bei dem beabsichtigt wurde, variable Variablen vielleicht zu verwenden. In diesem Fall wird beispielsweise nach einer Variableneigenschaft mit $this->{"myFunc$VAR"}(); gesucht.

    Beachten Sie, dass die Verwendung von Variablen die Ausnahme sein sollte. Neulinge versuchen oft, sie zu lässig zu verwenden, selbst wenn Arrays einfacher und passender wären.

  7. Fehlende Parens nach Sprachkonstrukten

    Hastige Eingabe kann dazu führen, dass öffnende Klammern if und for und foreach vergessen werden:

           ⇓
    foreach $array as $key) {
    

    Lösung: Fügen Sie die fehlende Öffnung ( zwischen Anweisung und Variable ein.

  8. Sonst erwartet keine Bedingungen

         ⇓
    else ($var >= 0)
    

    Lösung: Entfernen Sie die Bedingungen von else oder verwenden Sie elseif .

  9. Brauchen Sie Halterungen für den Verschluss

         ⇓
    function() uses $var {}
    

    Lösung: Fügen Sie Klammern um $var hinzu.

  10. Unsichtbarer Leerraum

    Wie in Referenzantwort zu "Invisible stray Unicode" (beispielsweise einem geschützten Leerzeichen ) erwähnt, wird dieser Fehler möglicherweise auch für ahnungslosen Code angezeigt:

    <?php
                              ⇐
    $var = new PDO(...);
    

    Dies ist eher beim Start von Dateien und beim Kopieren und Einfügen von Code der Fall. Erkundigen Sie sich bei einem Hexeditor, ob Ihr Code anscheinend kein Syntaxproblem enthält.

Siehe auch

42
mario

Unerwarteter T_CONSTANT_ENCAPSED_STRING 
Unerwarteter T_ENCAPSED_AND_WHITESPACE

Die unhandlichen Namen T_CONSTANT_ENCAPSED_STRING und T_ENCAPSED_AND_WHITESPACE beziehen sich auf zitierte "string" Literale.

Sie werden in verschiedenen Kontexten verwendet, aber das Syntaxproblem ist ziemlich ähnlich. T_ENCAPSED… Warnungen treten in Zeichenfolgen mit doppelten Anführungszeichen auf, während T_CONSTANT… Zeichenfolgen häufig in einfachen PHP -Ausdrücken oder -Anweisungen irregeführt werden.

  1. Falsche Variableninterpolation

    Am häufigsten kommt es bei falscher PHP - Variableninterpolation auf:

                              ⇓     ⇓
    echo "Here comes a $wrong['array'] access";
    

    Das Zitieren von Arrays-Schlüsseln ist im Kontext von PHP ein Muss. Bei doppelten Anführungszeichen (oder HEREDOCs) ist dies jedoch ein Fehler. Der Parser beschwert sich über den enthaltenen einfachen Anführungszeichen 'string', da er normalerweise einen Literal-Bezeichner/Schlüssel erwartet.

    Genauer gesagt, es ist gültig, PHP2-style einfache Syntax in Anführungszeichen für Array-Referenzen zu verwenden:

    echo "This is only $valid[here] ...";
    

    Verschachtelte Arrays oder tiefere Objektverweise erfordern jedoch den komplexen geschweiften Zeichenfolgenausdruck Syntax:

    echo "Use {$array['as_usual']} with curly syntax.";
    

    Wenn Sie sich nicht sicher sind, ist dies normalerweise sicherer. Es wird oft sogar als lesbarer angesehen. Und bessere IDEs verwenden dazu eine eindeutige Syntaxfärbung.

  2. Fehlende Verkettung 

    Wenn eine Zeichenfolge einem Ausdruck folgt, aber keine Verkettung oder ein anderer Operator vorhanden ist, wird PHP über das Zeichenfolgenliteral beschwert:

                           ⇓
    print "Hello " . WORLD  " !";
    

    Während es für Sie und mich offensichtlich ist, kann PHP nicht raten, dass die Zeichenfolge dort angehängt werden sollte.

  3. Verwirrende String-Anhänge 

    Der gleiche Syntaxfehler tritt auf, wenn Zeichenbegrenzer verwechselt werden. Eine Zeichenfolge, die mit einem einfachen '- oder doppelten "-Anführungszeichen beginnt, endet ebenfalls mit dem gleichen.

                    ⇓
    print "<a href="' . $link . '">click here</a>";
          ⌞⎽⎽⎽⎽⎽⎽⎽⎽⌟⌞⎽⎽⎽⎽⎽⎽⎽⎽⎽⎽⎽⌟⌞⎽⎽⎽⎽⎽⎽⎽⎽⎽⎽⎽⎽⎽⎽⎽⌟
    

    Dieses Beispiel begann mit Anführungszeichen. Für die HTML-Attribute waren jedoch auch doppelte Anführungszeichen vorgesehen. Der beabsichtigte Verkettungsoperator wurde jedoch als Teil einer zweiten Zeichenfolge in einfachen Anführungszeichen interpretiert.

    Tip: Stellen Sie Ihren Editor/Ihre IDE so ein, dass für einzelne und doppelte Anführungszeichen eine geringfügige Einfärbung verwendet wird. (Es hilft auch bei der Anwendungslogik, z. B. Strings in doppelten Anführungszeichen für die Textausgabe und Strings in einfachen Anführungszeichen nur für konstantenähnliche Werte zu bevorzugen.)

    Dies ist ein gutes Beispiel, bei dem Sie doppelte Anführungszeichen überhaupt nicht ausbrechen sollten. Verwenden Sie stattdessen einfach eigentliche \" escapes für die Anführungszeichen der HTML-Attribute:

    print "<a href=\"{$link}\">click here</a>";
    

    Während dies auch zu Syntax-Verwirrung führen kann, helfen alle besseren IDEs/Editoren wieder, indem sie die Fluchtzitate anders einfärben.

  4. Eröffnungszitat fehlt 

    Äquivalent sind vergessene Öffnung "' Anführungszeichen ein Rezept für Parserfehler:

                   ⇓
     make_url(login', 'open');
    

    Hier würde ', ' nach einem Barewort zu einem String-Literal, wenn login offensichtlich ein String-Parameter sein sollte.

  5. Array-Listen 

    Wenn Sie ein ,-Komma in einem Array-Erstellungsblock nicht finden, werden dem Parser zwei aufeinanderfolgende Zeichenfolgen angezeigt:

    array(               ⇓
         "key" => "value"
         "next" => "....",
    );
    

    Beachten Sie, dass die letzte Zeile immer ein zusätzliches Komma enthalten kann, das Übersehen eines dazwischen ist jedoch unverzeihlich. Was ist ohne Syntaxhervorhebung schwer zu entdecken.

  6. Funktionsparameterlisten 

    Gleiches für Funktionsaufrufe :

                             ⇓
    myfunc(123, "text", "and"  "more")
    
  7. Runaway-Saiten 

    Eine häufige Variante sind ganz einfach vergessene String-Terminatoren:

                                    ⇓
    mysql_evil("SELECT * FROM stuffs);
    print "'ok'";
          ⇑
    

    Hier beschwert sich PHP über zwei direkt aufeinander folgende String-Literale. Aber die eigentliche Ursache ist natürlich die nicht geschlossene vorherige Saite.

_/ Siehe auch

31
mario

Unerwarteter T_STRING

T_STRING ist ein bisschen eine falsche Bezeichnung. Es bezieht sich nicht auf einen zitierten "string". Dies bedeutet, dass eine unformatierte ID gefunden wurde. Dies kann von bare Wörtern bis zu CONSTANT übrig gebliebenen oder Funktionsnamen, vergessenen nicht zitierten Zeichenfolgen oder einfachem Text reichen.

  1. Falsche Anführungszeichen

    Dieser Syntaxfehler tritt jedoch am häufigsten bei falsch angegebenen Zeichenfolgenwerten auf. Jedes "- oder '-Zitat ohne Flucht und ohne Streuung bildet einen ungültigen Ausdruck:

                   ⇓                  ⇓
     echo "<a href="http://example.com">click here</a>";
    

    Syntax-Hervorhebungen machen solche Fehler sehr offensichtlich. Denken Sie daran, Backslashes zu verwenden, um \" doppelte Anführungszeichen oder \' einfache Anführungszeichen zu maskieren - je nachdem, welches als String Enclosure verwendet wurde.

    • Zur Vereinfachung sollten Sie einfache Anführungszeichen bevorzugen, wenn Sie einfaches HTML mit doppelten Anführungszeichen ausgeben.
    • Verwenden Sie Zeichenfolgen in doppelten Anführungszeichen, wenn Sie Variablen interpolieren möchten, achten Sie jedoch darauf, dass keine wörtlichen "-Anführungszeichen vorkommen.
    • Bevorzugen Sie für eine längere Ausgabe mehrere echo/print-Zeilen, anstatt ein- und auszusteigen. Besser noch einen HEREDOC Abschnitt betrachten.

    Siehe auch Was ist der Unterschied zwischen Strings in einfachen und doppelten Anführungszeichen in PHP?.

  2. Nicht geschlossene Saiten

    Wenn Sie einen schließenden " verpassen , tritt in der Regel später ein Syntaxfehler auf. Eine nicht abgeschlossene Zeichenfolge verbraucht oft ein bisschen Code bis zum nächsten beabsichtigten Zeichenfolgenwert:

                                                           ⇓
    echo "Some text", $a_variable, "and some runaway string ;
    success("finished");
             ⇯
    

    Es sind nicht nur wörtliche T_STRINGs, gegen die der Parser dann protestieren kann. Eine weitere häufige Variante ist Unexpected '>' für nicht zitiertes wörtliches HTML.

  3. Nicht programmierbare String-Anführungszeichen

    Wenn Sie Code aus einem Blog oder einer Website kopieren und einfügen , wird der Code manchmal ungültig. typografische Anführungszeichen nicht was PHP erwartet:

    $text = ’Something something..’ + ”these ain't quotes”;
    

    Typografische/intelligente Anführungszeichen sind Unicode-Symbole. PHP behandelt sie als Teil des angrenzenden alphanumerischen Texts. Zum Beispiel wird ”these als konstante Kennung interpretiert. Jedes folgende Textliteral wird dann vom Parser als Bareword/T_STRING angesehen.

  4. Das fehlende Semikolon; nochmal

    Wenn Sie in den vorherigen Zeilen einen nicht abgeschlossenen Ausdruck haben, wird jede folgende Anweisung oder jedes folgende Sprachkonstrukt als roher Bezeichner angesehen:

           ⇓
    func1()
    function2();
    

    PHP kann einfach nicht wissen, ob Sie zwei Funktionen nacheinander ausführen oder ob Sie deren Ergebnisse multiplizieren, hinzufügen, vergleichen oder nur einen oder den anderen || ausführen möchten.

  5. Kurze offene Tags und <?xml -Header in PHP Skripten

    Das ist eher ungewöhnlich. Wenn jedoch short_open_tags aktiviert sind, können Sie Ihre PHP Skripte nicht starten mit einer XML-Deklaration :

          ⇓
    <?xml version="1.0"?>
    

    PHP wird den <? sehen und für sich zurückfordern. Es wird nicht verstehen, wofür der verirrte xml gedacht war. Es wird als konstant interpretiert. Aber der version 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.

  6. Unsichtbare Unicode-Zeichen

    Eine sehr abscheuliche Ursache für Syntaxfehler sind Unicode-Symbole wie nicht unterbrechendes Leerzeichen . PHP erlaubt Unicode-Zeichen als Bezeichnernamen. Wenn Sie eine T_STRING-Parser-Beschwerde für völlig unauffälligen Code erhalten, wie:

    <?php
        print 123;
    

    Sie müssen einen anderen Texteditor ausbauen. Oder sogar ein Verhexer. Was hier wie einfache Leerzeichen und Zeilenumbrüche aussieht, kann unsichtbare Konstanten enthalten. Java-basierte IDEs merken manchmal nichts von einer UTF-8-Stückliste, die durch Leerzeichen, Absatztrennzeichen usw. verstümmelt ist. Versuchen Sie, alles erneut zu bearbeiten, Leerzeichen zu entfernen und wieder normale Leerzeichen einzufügen.

    Sie können dies eingrenzen, indem Sie an jedem Zeilenanfang redundante ;-Anweisungstrennzeichen hinzufügen:

    <?php
        ;print 123;
    

    Das zusätzliche ;-Semikolon hier konvertiert das vorhergehende unsichtbare Zeichen in eine undefinierte konstante Referenz (Ausdruck als Anweisung). Wodurch PHP eine hilfreiche Benachrichtigung erzeugt.

  7. 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 Zeichen könnte der Bezeichner ein Sprachschlüsselwort oder ein Konstante sein.

    Dies ist ein häufiger Fehler, wenn der PHP -Code "übersetzt" aus in einer anderen Sprache geschriebenem Code (C, Java, JavaScript usw.) war. In solchen Fällen könnte 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.

  8. Escapezeichen Anführungszeichen

    Wenn Sie \ in einer Zeichenfolge verwenden, hat dies eine besondere Bedeutung. Dies wird als " Escape Character " bezeichnet und weist den Parser normalerweise an, das nächste Zeichen wörtlich zu nehmen.

    Beispiel: echo 'Jim said \'Hello\''; gibt Jim said 'hello' aus

    Wenn Sie dem schließenden Anführungszeichen einer Zeichenfolge entkommen, wird das schließende Anführungszeichen wörtlich und nicht bestimmungsgemäß verwendet, d. H. Als druckbares Anführungszeichen als Teil der Zeichenfolge, und die Zeichenfolge wird nicht geschlossen. Dies wird in der Regel nach dem Öffnen der nächsten Zeichenfolge oder am Ende des Skripts als Analysefehler angezeigt.

    Sehr häufiger Fehler beim Angeben von Pfaden in Windows: "C:\xampp\htdocs\" ist falsch. Du brauchst "C:\\xampp\\htdocs\\".

24
mario

Unerwarteter (

Öffnende Klammern folgen normalerweise Sprachkonstrukten wie if/foreach/for/array/list oder beginnen einen arithmetischen Ausdruck. Sie sind syntaktisch falsch nach "strings", einem vorherigen (), einem einzelnen $ und in einigen typischen Deklarationskontexten.

  1. Funktionsdeklarationsparameter

    Ein selteneres Vorkommen für diesen Fehler ist bei dem Versuch, Ausdrücke als Standardfunktionsparameter zu verwenden . Dies wird auch in PHP7 nicht unterstützt:

    function header_fallback($value, $expires = time() + 90000) {
    

    Parameter in einer Funktionsdeklaration können nur Literalwerte oder konstante Ausdrücke sein. Im Gegensatz zu Funktionsaufrufen, bei denen Sie whatever(1+something()*2) usw. frei verwenden können.

  2. Standardwerte für Klasseneigenschaften

    Dasselbe gilt für Deklarationen von Klassenmitgliedern , wobei nur Literal-/Konstantenwerte zulässig sind, keine Ausdrücke:

    class xyz {                   ⇓
        var $default = get_config("xyz_default");
    

    Schreiben 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.

  3. JavaScript-Syntax in PHP

    Die Verwendung von JavaScript oder jQuery-Syntax funktioniert in PHP aus offensichtlichen Gründen nicht:

    <?php      ⇓
        print $(document).text();
    

    In diesem Fall wird normalerweise eine nicht abgeschlossene vorherige Zeichenfolge angezeigt. und wörtliche <script> Abschnitte, die in den PHP Codekontext gelangen.

  4. isset (()), leer, key, next, current

    Sowohl isset() als auch empty() sind integrierte Sprachfunktionen, keine Funktionen. Sie müssen direkt auf eine Variable zugreifen . Wenn Sie versehentlich zu viele Klammern hinzufügen, erstellen Sie jedoch einen Ausdruck:

              ⇓
    if (isset(($_GET["id"]))) {
    

    Gleiches gilt für alle Sprachkonstrukte, die impliziten Variablennamenszugriff erfordern. Diese integrierten Funktionen sind Teil der Sprachgrammatik. Daher sind keine zusätzlichen dekorativen Klammern zulässig.

    Funktionen auf Benutzerebene, die einen variablen Verweis erfordern, aber ein übergebenes Ausdrucksergebnis erhalten, führen stattdessen zu Laufzeitfehlern.


Unerwarteter )

  1. Fehlender Funktionsparameter

    Sie können nicht streuen Kommas zuletzt in einem Funktionsaufruf . PHP erwartet dort einen Wert und beschwert sich daher über eine vorzeitige Schließung ) Klammer.

                  ⇓
    callfunc(1, 2, );
    

    Ein nachfolgendes Komma ist nur in array() - oder list() -Konstrukten zulässig.

  2. Unvollendete Ausdrücke

    Wenn Sie in einem arithmetischen Ausdruck etwas vergessen, gibt der Parser auf. Denn wie soll es evtl. interpretieren, dass:

                   ⇓
    $var = 2 * (1 + );
    

    Und wenn Sie sogar das schließende ) vergessen haben, erhalten Sie stattdessen eine Beschwerde über das unerwartete Semikolon.

  3. Foreach as constant

    Für vergessene Variable $ Präfixe in Steueranweisungen sehen Sie:

                       ↓    ⇓
    foreach ($array as wrong) {
    

    PHP sagt hier manchmal, dass es stattdessen einen :: erwartet. Weil eine class :: $ -Variable den erwarteten $ -Variablenausdruck hätte erfüllen können.


Unerwarteter {

Geschweifte Klammern { und } schließen Codeblöcke ein. Und Syntaxfehler weisen normalerweise auf eine inkorrekte Verschachtelung hin.

  1. Nicht passende Unterausdrücke in einem if

    Am häufigsten sind nsymmetrisch ( und ) die Ursache, wenn der Parser sich darüber beschwert, dass das öffnende Curly { zu früh erscheint. Ein einfaches Beispiel:

                                  ⇓
    if (($x == $y) && (2 == true) {
    

    Zählen Sie Ihre Eltern oder verwenden Sie eine IDE, die dabei hilft. Schreiben Sie auch keinen Code ohne Leerzeichen. Lesbarkeit zählt.

  2. {und} im Ausdruckskontext

    Sie können in Ausdrücken keine geschweiften Klammern verwenden. Wenn Sie Klammern und Curlys verwechseln, entspricht dies nicht dem Sprachgramm:

               ⇓
    $var = 5 * {7 + $x};
    

    Es gibt einige Ausnahmen für die Identifikatorkonstruktion, z. B. die lokale Bereichsvariable ${references}.

  3. Variable Variablen oder geschweifte var-Ausdrücke

    Das ist ziemlich selten. Möglicherweise erhalten Sie aber auch { und } Parser-Beschwerden für komplexe Variablenausdrücke:

                          ⇓
    print "Hello {$world[2{]} !";
    

    Obwohl es in solchen Kontexten eine höhere Wahrscheinlichkeit für einen unerwarteten } gibt.


Unerwarteter }

Wenn der Fehler "Unerwarteter }" auftritt, haben Sie einen Codeblock meistens zu früh geschlossen.

  1. Letzte Anweisung in einem Codeblock

    Es kann für jeden nicht abgeschlossenen Ausdruck vorkommen.

    Und wenn in der letzten Zeile eines Funktions-/Codeblocks ein abschließendes ; Semikolon fehlt:

    function whatever() {
        doStuff()
    }            ⇧
    

    Hier kann der Parser nicht sagen, ob Sie vielleicht noch + 25; zum Funktionsergebnis oder zu etwas anderem hinzufügen wollten.

  2. Ungültige Blockverschachtelung/Vergessen {

    Dieser Parser-Fehler tritt manchmal auf, wenn ein Codeblock } zu früh geschlossen wurde oder Sie das Öffnen { vergessen haben.

    function doStuff() {
        if (true)    ⇦
            print "yes";
        }
    }   ⇧
    

    Im obigen Snippet hatte if keine öffnende { geschweifte Klammer. Somit wurde der abschließende } unten überflüssig. Und deshalb war die nächste schließende }, die für die Funktion vorgesehen war, nicht mit der ursprünglichen öffnenden { geschweiften Klammer assoziierbar.

    Solche Fehler sind noch schwerer zu finden, wenn der Code nicht richtig eingerückt ist. Verwenden Sie ein IDE und eine passende Klammer.


Unerwarteter {, erwartet (

Sprachkonstrukte, die einen Bedingungs-/Deklarationsheader und einen Codeblock erfordern, lösen diesen Fehler aus.

  1. Parameterlisten

    Zum Beispiel falsch deklarierte Funktionen ohne Parameterliste sind nicht erlaubt:

                     ⇓
    function whatever {
    }
    
  2. Bedingungen für Steueranweisungen

    Und Sie können auch kein if ohne Bedingung haben.

      ⇓
    if {
    }
    

    Was natürlich keinen Sinn ergibt. Dasselbe gilt für die üblichen Verdächtigen, for/foreach, while/do usw.

    Wenn Sie diesen speziellen Fehler haben, sollten Sie auf jeden Fall einige manuelle Beispiele nachschlagen.

16
mario

Unerwartetes $ ende

Wenn PHP von einem "unerwarteten $end" spricht, bedeutet dies, dass Ihr Code vorzeitig beendet wurde. (Die Meldung ist im wahrsten Sinne des Wortes etwas irreführend. Es handelt sich nicht um eine Variable mit dem Namen "$ end", wie dies manchmal von Neulingen angenommen wird. Sie bezieht sich auf das "Dateiende". EOF.)

Ursache: Unsymmetrischer { und } für Codeblöcke/und Funktions- oder Klassendeklarationen.

Es geht fast immer um eine fehlende } geschweifte Klammer, um vorhergehende Codeblöcke zu schließen.

  • Verwenden Sie auch hier die richtige Einrückung, um solche Probleme zu vermeiden.

  • Verwenden Sie ein IDE mit eckiger Klammer, um herauszufinden, wo der } nicht stimmt. In den meisten IDEs und Texteditoren gibt es Tastaturkürzel:

    • NetBeans, PhpStorm, Komodo: Ctrl[ und Ctrl]
    • Eclipse, Aptana: CtrlShiftP
    • Atom, erhaben: Ctrlm - Zend Studio CtrlM
    • Geany, Notepad ++: CtrlB - Joe: CtrlG - Emacs: C-M-n - Vim: %

Die meisten IDEs markieren auch passende Klammern, Klammern und Klammern. Das macht es ziemlich einfach, ihre Korrelation zu untersuchen:

Bracket matching in an IDE

Nicht abgeschlossene Ausdrücke

Ein Unexpected $end-Syntax-/Parser-Fehler kann auch bei nicht abgeschlossenen Ausdrücken oder Anweisungen auftreten:

  • $var = func(1,?>EOF

Schauen Sie sich also zuerst das Ende der Skripte an. Ein nachfolgender ; ist für die letzte Anweisung in jedem PHP Skript oftmals überflüssig. Aber Sie sollten eine haben. Gerade weil es solche Syntaxprobleme einschränkt.

Eingezogene HEREDOC-Marker

Ein weiteres häufiges Vorkommen tritt mit HEREDOC oder NOWDOC Strings auf. Die abschließende Markierung wird bei führenden Leerzeichen, Tabulatoren usw. ignoriert:

print <<< END
    Content...
    Content....
  END;
# ↑ terminator isn't exactly at the line start

Daher geht der Parser davon aus, dass die HEREDOC-Zeichenfolge bis zum Ende der Datei fortgesetzt wird (daher "Unerwartetes $ -Ende"). Nahezu alle IDEs und Syntaxhervorhebungs-Editoren machen dies offensichtlich oder warnen davor.

Escapezeichen Anführungszeichen

Wenn Sie \ in einer Zeichenfolge verwenden, hat dies eine besondere Bedeutung. Dies wird als " Escape Character " bezeichnet und weist den Parser normalerweise an, das nächste Zeichen wörtlich zu nehmen.

Beispiel: echo 'Jim said \'Hello\''; gibt Jim said 'hello' aus

Wenn Sie dem schließenden Anführungszeichen einer Zeichenfolge entkommen, wird das schließende Anführungszeichen wörtlich und nicht bestimmungsgemäß verwendet, d. H. Als druckbares Anführungszeichen als Teil der Zeichenfolge, und die Zeichenfolge wird nicht geschlossen. Dies wird in der Regel nach dem Öffnen der nächsten Zeichenfolge oder am Ende des Skripts als Analysefehler angezeigt.

Sehr häufiger Fehler beim Angeben von Pfaden in Windows: "C:\xampp\htdocs\" ist falsch. Du brauchst "C:\\xampp\\htdocs\\".

Alternative Syntax

Etwas seltener können Sie diesen Syntaxfehler feststellen, wenn Sie die alternative Syntax für Anweisungs-/Codeblöcke in Vorlagen verwenden. Verwenden Sie beispielsweise if: und else: und einen fehlenden endif;.

Siehe auch:

14
mario

Unerwartetes T_IF
Unerwartetes T_ELSEIF
Unerwartetes T_ELSE
Unerwartetes T_ENDIF

Bedingte Steuerblöcke if, elseif und else folgen einer einfachen Struktur. Wenn Sie auf einen Syntaxfehler stoßen, handelt es sich höchstwahrscheinlich um eine ungültige Blockverschachtelung → mit fehlenden { Geschweiften Klammern } - oder einer zu vielen.

enter image description here

  1. Fehlender { Oder } Aufgrund falscher Einrückung

    Nicht übereinstimmende Code-Klammern sind für weniger gut formatierten Code wie folgt üblich:

    if((!($opt["uniQartz5.8"]!=$this->check58)) or (empty($_POST['poree']))) {if
    ($true) {echo"halp";} elseif((!$z)or%b){excSmthng(False,5.8)}elseif (False){
    

    Wenn Ihr Code so aussieht, starten Sie neu! Ansonsten ist es für Sie oder andere Personen nicht fixierbar. Es macht keinen Sinn, dies im Internet zu präsentieren und 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 zu sehen, ob alle gepaart sind.

    if (true) {
         if (false) {
                  …
         }
         elseif ($whatever) {
             if ($something2) {
                 …
             } 
             else {
                 …
             }
         }
         else {
             …
         }
         if (false) {    //   a second `if` tree
             …
         }
         else {
             …
         }
    }
    elseif (false) {
        …
    }
    

    Jedes doppelte }} Schließt nicht nur einen Zweig, sondern eine vorherige Bedingungsstruktur. Halten Sie sich daher an einen Codierungsstil. Nicht mischen und in verschachtelten if/else-Bäumen zusammenpassen.

    Abgesehen von der Konsistenz ist es hilfreich, auch langwierige Bedingungen zu vermeiden. Verwenden Sie temporäre Variablen oder Funktionen, um unlesbare if- Ausdrücke zu vermeiden.

  2. IF kann nicht in Ausdrücken verwendet werden

    Ein überraschend häufiger Newcomer-Fehler ist der Versuch, eine if -Anweisung in einem Ausdruck zu verwenden, beispielsweise eine print -Anweisung:

                       ⇓
    echo "<a href='" . if ($link == "example.org") { echo …
    

    Welches ist natürlich ungültig.

    Sie können eine ternäre Bedingung verwenden, achten Sie jedoch auf die Auswirkungen auf die Lesbarkeit.

    echo "<a href='" . ($link ? "http://yes" : "http://no") . "</a>";
    

    Andernfalls brechen Sie solche Ausgabekonstrukte auf: Verwenden Sie mehrere ifs und echos .
    Besser noch, verwenden Sie temporäre Variablen und platzieren Sie Ihre Bedingungen vor:

    if ($link) { $href = "yes"; } else { $href = "no"; }
    echo "<a href='$href'>Link</a>";
    

    Oft ist es auch sinnvoll, Funktionen oder Methoden für solche Fälle zu definieren.

    Kontrollblöcke liefern keine "Ergebnisse"

    Jetzt ist dies weniger verbreitet, aber einige Programmierer versuchen sogar, if so zu behandeln, als ob es ein Ergebnis zurückgeben könnte:

    $var = if ($x == $y) { "true" };
    

    Dies ist strukturell identisch mit der Verwendung von if in einer Zeichenfolgenverkettung/einem Zeichenfolgenausdruck.

    • Aber Kontrollstrukturen (if/foreach/while) haben kein "Ergebnis".
    • Die wörtliche Zeichenfolge "true" wäre auch nur eine leere Aussage.

    Sie müssen eine Zuweisung verwenden im Codeblock:

    if ($x == $y) { $var = "true"; }
    

    Alternativ können Sie einen ternären Vergleich ?: Durchführen.

    Wenn in Wenn

    Sie können kein if verschachteln innerhalb einer Bedingung:

                        ⇓
    if ($x == true and (if $y != false)) { ... }
    

    Das ist natürlich überflüssig, weil das and (oder or) bereits Verkettungsvergleiche erlaubt.

  3. Vergessen Sie Semikolons ;

    Noch einmal: Jeder Steuerblock muss eine Anweisung sein. Wenn das vorherige Codeteil nicht mit einem Semikolon abgeschlossen ist, handelt es sich garantiert um einen Syntaxfehler:

                    ⇓
    $var = 1 + 2 + 3
    if (true) { … }
    

    Übrigens benötigt die letzte Zeile in einem {…} - Codeblock auch ein Semikolon.

  4. Semikolon zu früh

    Jetzt ist es wahrscheinlich falsch, einen bestimmten Codierungsstil zu beschuldigen, da diese Falle zu leicht zu übersehen ist:

                ⇓
    if ($x == 5);
    {
        $y = 7;
    }
    else           ←
    {
        $x = -1;    
    }
    

    Was öfter passiert, als Sie sich vorstellen können.

    • Wenn Sie beenden Sie den Ausdruck if () mit ; , wird eine void-Anweisung ausgeführt. Der ; Wird ein leerer {} Für sich!
    • Der Block {…} Ist somit vom if getrennt und würde immer ausgeführt.
    • Das else hatte also keine Beziehung mehr zu einem offenen if-Konstrukt, weshalb dies zu einem unerwarteten T_ELSE-Syntaxfehler führen würde.

    Das erklärt auch eine ebenfalls subtile Variation dieses Syntaxfehlers:

    if ($x) { x_is_true(); }; else { something_else(); };
    

    Wobei das ; Nach dem Codeblock {…} Das gesamte Konstrukt if beendet und den Zweig else syntaktisch durchtrennt.

  5. Keine Codeblöcke verwenden

    Es ist syntaktisch erlaubt, geschweifte Klammern {} Für Codeblöcke in if/elseif/else-Zweigen wegzulassen. Was leider ein Syntaxstil ist, der bei nicht versierten Programmierern sehr verbreitet ist. (Unter der falschen Annahme war dies schneller zu tippen oder zu lesen).

    Es ist jedoch sehr wahrscheinlich, dass dies die Syntax auslöst. Früher oder später finden zusätzliche Anweisungen ihren Weg in die if/else-Zweige:

    if (true)
        $x = 5;
    elseif (false)
        $x = 6;
        $y = 7;     ←
    else
        $z = 0;
    

    Aber um Codeblöcke tatsächlich zu verwenden, müssen Sie haben schreiben {} Sie als solche!

    Selbst erfahrene Programmierer vermeiden diese Syntax ohne Anführungszeichen oder verstehen sie zumindest als Ausnahme von der Regel.

  6. Else/Elseif in falscher Reihenfolge

    Eine Sache, an die Sie sich erinnern sollten, ist natürlich die bedingte Reihenfolge .

    if ($a) { … }
    else { … }
    elseif ($b) { … }
    ↑
    

    Sie können so viele elseifs haben, wie Sie möchten, aber else muss zuletzt gehen . Ist einfach so.

  7. Klassenerklärungen

    Wie oben erwähnt , kann eine Klassendeklaration keine Steueranweisungen enthalten:

    class xyz {
        if (true) {
            function ($var) {}
        }
    

    Sie haben entweder eine Funktion vergessen definiert oder eine } Zu früh geschlossen.

  8. Unerwartetes T_ELSEIF/T_ELSE

    Beim Mischen von PHP und HTML muss das schließende } Für ein if/elseif Im selben PHP Block <?php ?> Als nächstes elseif/else. Dies erzeugt einen Fehler, da das schließende } Für if Teil des elseif sein muss:

    <?php if ($x) { ?>
        html
    <?php } ?>
    <?php elseif ($y) { ?>
        html
    <?php } ?>
    

    Die richtige Form <?php } elseif:

    <?php if ($x) { ?>
        html
    <?php } elseif ($y) { ?>
        html
    <?php } ?>
    

    Dies ist mehr oder weniger eine Variation von falschen Einrückungen - vermutlich oft aufgrund falscher Codierungsabsichten.
    Sie können nicht andere Anweisungen pürieren dazwischenif und elseif/else strukturelle Token:

    if (true) {
    }
    echo "in between";    ←
    elseif (false) {
    }
    ?> text <?php      ←
    else {
    }
    

    Beides kann nur in {…} - Codeblöcken vorkommen, nicht zwischen Kontrollstrukturtoken.

    • Das würde sowieso keinen Sinn ergeben. Es ist nicht so, dass es einen "undefinierten" Zustand gab, als PHP zwischen if und else Zweigen sprang.
    • Sie müssen sich überlegen, wo Print-Anweisungen gehören oder ob sie in beiden Zweigen wiederholt werden müssen.

    Sie können auch nicht ein if/else trennen zwischen verschiedenen Kontrollstrukturen:

    foreach ($array as $i) {
        if ($i) { … }
    }
    else { … }
    

    Es gibt keine syntaktische Beziehung zwischen if und else. Der lexikalische Gültigkeitsbereich von foreach endet bei }, Sodass die if -Struktur nicht fortgesetzt werden muss.

  9. T_ENDIF

    Wenn ein unerwartetes T_ENDIF beanstandet wird, verwenden Sie den alternativen Syntaxstil if:elseif:else:endif;. Worüber Sie sich wirklich zweimal Gedanken machen sollten.

    • Eine häufige Gefahr ist das Verwirren des unheimlichen ähnliches : - Doppelpunkts für ein ; - Semikolon . (In "Semikolon zu früh" behandelt)

    • Da Einrückungen in Vorlagendateien schwerer zu verfolgen sind, ist die Verwendung der alternativen Syntax umso schwieriger - es ist plausibel, dass Ihr endif; Keinem if: Entspricht.

    • Die Verwendung von } endif; ist ein verdoppeltif- Terminator.

    Während ein "unerwartetes $ Ende" normalerweise der Preis für eine vergessene schließende } Geschweifte Klammer ist.

  10. Zuordnung vs. Vergleich

    Das ist also kein Syntaxfehler, aber in diesem Zusammenhang erwähnenswert:

           ⇓
    if ($x = true) { }
    else { do_false(); }
    

    Dies ist kein ==/=== - Vergleich, sondern eine = - Zuweisung . Dies ist ziemlich subtil und wird einige Benutzer leicht dazu bringen, ganze Bedingungsblöcke hilflos zu bearbeiten. Achten Sie zuerst auf unbeabsichtigte Zuweisungen - immer dann, wenn Sie einen logischen Fehler oder ein Fehlverhalten feststellen.

13
mario

Unerwartetes T_IF 
Unerwartetes T_FOREACH 
Unerwartetes T_FOR 
Unerwartetes T_WHILE 
Unerwartetes T_DO 
Unerwartetes T_ECHO

Kontrollkonstrukte wie if, foreach, for, while, list, global, return, do, print, echo dürfen nur als Anweisungen verwendet werden. Sie befinden sich normalerweise in einer eigenen Zeile.

  1. Semikolon; wo bist du? 

    Ziemlich universell haben Sie in der vorherigen Zeile ein Semikolon verpasst , wenn der Parser sich über eine Steueranweisung beschwert:

                 ⇓
    $x = myfunc()
    if (true) {
    

    Lösung: Schauen Sie in die vorherige Zeile. Semikolon hinzufügen.

  2. Klassenerklärungen 

    Ein anderer Ort, an dem dies auftritt, ist in Klassendeklarationen . Im Klassenabschnitt können Sie nur Eigenschafteninitialisierungen und Methodenabschnitte auflisten. Dort darf sich kein Code befinden.

    class xyz {
        if (true) {}
        foreach ($var) {}
    

    Solche Syntaxfehler treten häufig bei falsch verschachtelten { und } auf. Insbesondere wenn Funktionscodeblöcke zu früh geschlossen wurden.

  3. Anweisungen im Ausdruckskontext 

    Die meisten Sprachkonstrukte können nur als Anweisungen verwendet werden. Sie sind nicht für andere Ausdrücke gedacht:

                       ⇓
    $var = array(1, 2, foreach($else as $_), 5, 6);
    

    Sie können auch keine if in Strings, Math-Ausdrücken oder anderswo verwenden:

                   ⇓
    print "Oh, " . if (true) { "you!" } . " won't work";
    // Use a ternary condition here instead, when versed enough.
    

    Um if-ähnliche Bedingungen speziell in einen Ausdruck einzubetten, möchten Sie häufig eine ?:-ternäre Auswertung verwenden.

    Dasselbe gilt für for, while, global, echo und eine kleinere Erweiterung list.

              ⇓
    echo 123, echo 567, "huh?";
    

    Während print() eine Sprache ist, die im Ausdruckskontext verwendet werden kann. (Macht aber selten Sinn.)

  4. Reservierte Schlüsselwörter als Bezeichner 

    Sie können auch do oder if und andere Sprachkonstrukte nicht für benutzerdefinierte Funktionen oder Klassennamen verwenden. (Vielleicht in PHP7. Aber selbst dann wäre es nicht ratsam.)

11
mario

Unerwartetes "?"

Wenn Sie versuchen, den Nullkoaleszenzoperator ?? in einer Version von PHP vor PHP 7 zu verwenden, wird dieser Fehler angezeigt.

<?= $a ?? 2; // works in PHP 7+
<?= (!empty($a)) ? $a : 2; // All versions of PHP

Unerwartetes '?' Erwartet Variable

Ein ähnlicher Fehler kann bei nullfähigen Typen auftreten, wie in:

function add(?int $sum): ?int {

Was wiederum darauf hinweist, dass eine veraltete PHP - Version verwendet wird (entweder die CLI-Version php -v oder der Webserver, der an eine phpinfo(); gebunden ist).

6
John Conde

Unerwartete T_LNUMBER

Das Token T_LNUMBER bezieht sich auf eine "lange"/Zahl.

  1. Ungültige Variablennamen

    In PHP und den meisten anderen Programmiersprachen darf Variablen nicht mit einer Zahl beginnen. Das erste Zeichen muss ein Buchstabe oder ein Unterstrich sein.

    $1   // Bad
    $_1  // Good
    

    *

    • Sehr oft erscheint für die Verwendung von preg_replace- Platzhaltern "$1" im PHP Kontext:

      #                         ↓            ⇓  ↓
      preg_replace("/#(\w+)/e",  strtopupper($1) )
      

      Wo der Rückruf hätte zitiert werden sollen. (Jetzt ist das Regex-Flag /e veraltet. Manchmal wird es jedoch immer noch in preg_replace_callback-Funktionen missbraucht.)

    • Dieselbe Bezeichnerbeschränkung gilt auch für Objekteigenschaften , btw.

             ↓
      $json->0->value
      
    • Während der Tokenizer/Parser kein Literal $1 als Variablennamen zulässt, könnte man ${1} oder ${"1"} verwenden . Dies ist eine syntaktische Problemumgehung für nicht standardmäßige Bezeichner. (Es ist am besten, sich das als lokale Bereichssuche vorzustellen. Aber im Allgemeinen: Ziehen Sie für solche Fälle einfache Arrays vor!)

    • Amüsanterweise, aber nicht unbedingt empfohlen, erlaubt der PHP-Parser Unicode-Identifikatoren. so dass $➊ gültig wäre. (Im Gegensatz zu einem wörtlichen 1).

  2. Streunender Array-Eintrag

    Eine unerwartete Länge kann auch für Array-Deklarationen - auftreten, wenn , Kommas fehlen:

    #            ↓ ↓
    $xy = array(1 2 3);
    

    Oder ebenso Funktionsaufrufe und Deklarationen und andere Konstrukte:

    • func(1, 2 3);
    • function xy($z 2);
    • for ($i=2 3<$z)

    Normalerweise fehlt also einer der Codes ; oder ,, um Listen oder Ausdrücke zu trennen.

  3. Falsch zitiertes HTML

    Und wieder sind falsch zitierte Zeichenfolgen eine häufige Quelle für Streunummern:

    #                 ↓ ↓          
    echo "<td colspan="3">something bad</td>";
    

    Solche Fälle sollten mehr oder weniger wie nerwarteter T_STRING Fehler behandelt werden.

  4. Andere Bezeichner

    Weder Funktionen, Klassen noch Namespaces können mit einer Zahl beginnen:

             ↓
    function 123shop() {
    

    Ähnlich wie bei Variablennamen.

5
John Conde

Unerwartetes "="

Dies kann durch ungültige Zeichen in einem Variablennamen verursacht werden. Variablennamen müssen folgen diesen Regeln:

Variablennamen folgen den gleichen Regeln wie andere Bezeichnungen in PHP. Ein gültiger Variablenname beginnt mit einem Buchstaben oder Unterstrich, gefolgt von einer beliebigen Anzahl von Buchstaben, Zahlen oder Unterstrichen. Als regulärer Ausdruck würde er folgendermaßen ausgedrückt: '[a-zA-Z_\x7f-\xff] [a-zA-Z0-9_\x7f-\xff] *

2
John Conde

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, sodass der Gesamtausdruck einen Wert ergibt. Das ist der Unterschied zwischen einer Aussage und einem Ausdruck.

Das bedeutet, dass continue nicht in einer ternären Anweisung oder in einer Anweisung verwendet werden kann, für die ein Rückgabewert erforderlich ist.

Unerwarteter "Bruch" (T_BREAK)

Gleiches gilt natürlich auch für break;. Sie kann auch nicht im Ausdruckskontext verwendet werden, sondern eine strikte Anweisung (auf derselben Ebene wie foreach oder ein if-Block).

Unerwarteter 'return' (T_RETURN)

Das könnte für return überraschender sein, aber das ist auch nur eine Block-Ebene Anweisung . Es gibt einen Wert (oder NULL) an den höheren Gültigkeitsbereich/die übergeordnete Funktion zurück, wertet es jedoch nicht als Ausdruck selbst aus. → Das heißt: Es hat keinen Sinn, return(return(false);; zu tun. 

1
John Conde

Unerwartetes 'endwhile' (T_ENDWHILE)

Die Syntax verwendet einen Doppelpunkt. Wenn kein Doppelpunkt vorhanden ist, wird der obige Fehler angezeigt

<?php while($query->fetch()): ?>
 .... 
<?php endwhile; ?>

Eine Alternative zu dieser Syntax ist die Verwendung von geschweiften Klammern

<?php while($query->fetch()) { ?>
  ....
<?php } ?>

http://php.net/manual/de/control-structures.while.php

0
mplungjan

Eine Fehlermeldung, die Parse error: syntax error, unexpected ':' beginnt, kann verursacht werden, indem versehentlich eine statische Klassenreferenz Class::$Variable als Class:$Variable geschrieben wird.

0
David Spector