PHP-Analyse- / Syntaxfehler; und wie man sie löst

651

Jeder stößt auf Syntaxfehler. Selbst erfahrene Programmierer machen Tippfehler. Für Neulinge ist es nur ein Teil des Lernprozesses. Es ist jedoch oft einfach, Fehlermeldungen zu interpretieren, wie z.

PHP-Analysefehler: Syntaxfehler, unerwartetes '{' in index.php in Zeile 20

Das unerwartete Symbol ist nicht immer der wahre Schuldige. Die Zeilennummer gibt jedoch eine ungefähre Vorstellung davon, wo Sie anfangen sollen zu suchen.

Schauen Sie immer auf dem Code Kontext . Der Syntaxfehler verbirgt sich häufig in den genannten oder in früheren Codezeilen . Vergleichen Sie Ihren Code mit Syntaxbeispielen aus dem Handbuch.

Zwar passt nicht jeder Fall zum anderen. Es gibt jedoch einige allgemeine Schritte, um Syntaxfehler zu beheben . Diese Referenzen fassten die häufigsten Fallstricke zusammen:

Eng verwandte Referenzen:

Und:

Während Stack Overflow auch Rookie-Codierer willkommen heißt, ist es hauptsächlich auf professionelle Programmierfragen ausgerichtet.

  • Die Beantwortung von Codierungsfehlern und engen Tippfehlern wird meist als nicht thematisch angesehen.
  • Nehmen Sie sich also bitte die Zeit, um die grundlegenden Schritte zu befolgen , bevor Sie Syntaxkorrekturanforderungen veröffentlichen.
  • Wenn Sie dies dennoch tun müssen, zeigen Sie bitte Ihre eigene Lösungsinitiative, versuchte Korrekturen und Ihren Denkprozess darüber, was falsch aussieht oder möglicherweise falsch ist.

Wenn dein Browser Fehlermeldungen wie "SyntaxError: unzulässiges Zeichen" anzeigt, ist dies nicht der Fall-bezogen, aber a - Syntaxfehler .


Syntaxfehler beim Herstellercode: Beachten Sie schließlich, dass der Syntaxfehler nicht durch Bearbeiten Ihrer Codebasis, sondern nach der Installation oder Aktualisierung eines externen Herstellerpakets auf eine Inkompatibilität der PHP-Version zurückzuführen sein kann. Überprüfen Sie daher die Anforderungen des Herstellers anhand Ihrer Plattform installieren.

Mario
quelle
1
Dies sind nicht genug Daten, um eine Antwort zu sein, aber man könnte einen Analysator mit parsekit_compile_string schreiben und freundlichere Antworten darauf geben. Wenn dies in Ihre IDE integriert ist, kann dies sehr informativ sein.
Owen Beresford
4
Sie haben beeindruckend viel Arbeit investiert. Respekt dafür. Es ist wahrscheinlich sehr gut für Lehrer zu lernen, schnell auf Fehler hinzuweisen, oder für diejenigen, die IDEs erstellen oder schnelle Korrekturen implementieren. IDEs erledigen den größten Teil dieser Arbeit jedoch bereits effektiv für Sie, wie @Panique vorschlägt. Darüber hinaus ist in vielen Fällen der Neustart von vorne eine gute Option.
Allprog
1
@ Fred-ii- Ich denke, die meisten Ursachen ähneln dem T_IF / T_FOREACH / ...Block. Obwohl ich eine individuellere Zusammenfassung für IF / ELSE / ELSEIF-Fragen erstellen wollte.
Mario
1
@mario Sie wissen nicht, wie Sie das ausdrücken sollen, aber sollten diese Fragen und Antworten vielleicht etwas umgeschrieben und strukturierter sein? (temporärer Kommentar)
Rizier123
2
Wissen Sie, ich wünschte, ich hätte diese Liste gehabt, als ich vor Jahren PHP lernte. Sehr hilfreich, besonders für Anfänger.
Chipster

Antworten:

290

Was sind die Syntaxfehler?

PHP gehört zu den Programmiersprachen C-Stil und Imperativ . Es hat starre Grammatikregeln, von denen es sich nicht erholen kann, wenn es auf falsch platzierte Symbole oder Bezeichner stößt. Es kann Ihre Codierungsabsichten nicht erraten.

Zusammenfassung der Funktionsdefinitionssyntax

Wichtigste Tipps

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

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

  • Verwenden Sie eine IDE oder einen Editor für PHP mit Syntaxhervorhebung . Welche helfen auch beim Ausgleich von Klammern / Klammern.

    Erwartet: Semikolon

  • Lesen Sie die Sprachreferenz und Beispiele im Handbuch. Zweimal, um etwas kompetenter zu werden.

So interpretieren Sie Parserfehler

Eine typische Syntaxfehlermeldung lautet:

Parse - Fehler: Syntaxfehler, unerwarteter T_STRING , erwartet ; in file.php auf Linie 217

Hier wird der mögliche Ort eines Syntaxfehlers aufgelistet . Siehe den genannten Dateinamen und Zeilennummer .

Ein Spitzname wieT_STRING erklärt , welches Symbol der Parser / tokenizer nicht endgültig verarbeiten kann. Dies ist jedoch nicht unbedingt die Ursache für den Syntaxfehler.

Es ist wichtig zu untersuchen vorherige Codezeilen . Oft sind Syntaxfehler nur Pannen, die früher aufgetreten sind. Die Fehlerzeilennummer ist genau dort, wo der Parser endgültig aufgegeben hat, um alles zu verarbeiten.

Syntaxfehler lösen

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

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

    • Bei außer Kontrolle geratenen Zeichenfolgen und falsch platzierten Operatoren finden Sie hier normalerweise den Schuldigen.

    • Lesen Sie die Zeile von links nach rechts und stellen Sie sich vor, was jedes Symbol tut.

  • Regelmäßiger müssen Sie auch die vorhergehenden Zeilen betrachten .

    • Insbesondere fehlen fehlende ;Semikolons an den vorherigen Zeilenenden / Anweisungen. (Zumindest aus stilistischer Sicht.)

    • Wenn {Codeblöcke }falsch geschlossen oder verschachtelt sind, müssen Sie den Quellcode möglicherweise noch weiter untersuchen. Verwenden Sie die richtige Codeeinrückung , um dies zu vereinfachen.

  • Schauen Sie sich die Syntaxfärbung an !

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

    • Die Bediener +-*/.sollten ebenfalls deutlich getönt sein. Sonst könnten sie im falschen Kontext sein.

    • Wenn sich die Färbung der Zeichenfolgen zu weit oder zu kurz erstreckt, haben Sie eine nicht entflohene oder fehlende Abschluss- "oder 'Zeichenfolgenmarkierung gefunden.

    • Zwei gleichfarbige Interpunktionszeichen nebeneinander zu haben, kann ebenfalls Probleme verursachen. Normalerweise sind Operatoren allein, wenn dies nicht der Fall ++ist --, oder Klammern, die einem Operator folgen. Zwei Zeichenfolgen / Bezeichner, die direkt aufeinander folgen, sind in den meisten Kontexten falsch.

  • Whitespace ist dein Freund . Befolgen Sie einen beliebigen Codierungsstil.

  • Brechen Sie lange Schlangen vorübergehend auf.

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

    • Teilen Sie komplexe ifAnweisungen in unterschiedliche oder verschachtelte ifBedingungen auf.

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

    • Fügen Sie Zeilenumbrüche hinzu zwischen:

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

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

  • Kommentieren Sie Code zu verletzen.

    • Wenn Sie die Problemquelle nicht isolieren können, beginnen Sie mit dem Auskommentieren (und damit vorübergehenden Entfernen) von Codeblöcken.

    • Sobald Sie den Parsing-Fehler behoben haben, haben Sie die Problemquelle gefunden. Schau dort genauer hin.

    • Manchmal möchten Sie vorübergehend vollständige Funktions- / Methodenblöcke entfernen. (Bei nicht übereinstimmenden geschweiften Klammern und falsch eingerücktem Code.)

    • Wenn Sie das Syntaxproblem nicht beheben können, versuchen Sie, die auskommentierten Abschnitte von Grund auf neu zu schreiben .

  • Vermeiden Sie als Neuling einige der verwirrenden Syntaxkonstrukte.

    • Der ternäre ? :Bedingungsoperator kann Code komprimieren und ist in der Tat nützlich. Die Lesbarkeit wird jedoch nicht in allen Fällen verbessert. Bevorzugen Sie einfache ifAnweisungen, wenn Sie nicht umgekehrt sind.

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

  • Die häufigsten Fehler bei Neulingen sind:

    • Fehlende Semikolons ;zum Beenden von Anweisungen / Zeilen.

    • Nicht übereinstimmende Zeichenfolgen in Anführungszeichen für "oder 'und nicht angeführte Anführungszeichen innerhalb.

    • Vergessene Operatoren, insbesondere für die .Verkettung von Zeichenfolgen .

    • Unausgeglichene (Klammern ). Zählen Sie sie in der angegebenen Zeile. Gibt es eine gleiche Anzahl von ihnen?

  • Vergessen Sie nicht, dass das Lösen eines Syntaxproblems das nächste aufdecken kann.

    • Wenn Sie ein Problem beseitigen, andere jedoch in einem der folgenden Codes auftauchen, sind Sie meistens auf dem richtigen Weg.

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

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

    • Nehmen Sie ein Versionsverwaltungssystem für den Quellcode an. Sie können immer eine diffder defekten und letzten Arbeitsversionen anzeigen . Das könnte aufschlussreich sein, was das Syntaxproblem ist.
  • Unsichtbare streunende Unicode-Zeichen : In einigen Fällen müssen Sie einen Hexeditor oder einen anderen Editor / Viewer für Ihre Quelle verwenden. Einige Probleme können nicht nur durch Betrachten Ihres Codes gefunden werden.

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

    • Insbesondere Stücklisten, Leerzeichen mit der Breite Null oder nicht unterbrechende Leerzeichen und intelligente Anführungszeichen können regelmäßig in den Quellcode gelangen.

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

    • PHP \nberücksichtigt nur Zeilenumbrüche, keine \rWagenrückläufe.

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

    • Es tritt häufig nur dann als Problem auf, wenn einzeilige //oder #Kommentare verwendet werden. Mehrzeilige /*...*/Kommentare stören den Parser selten, wenn Zeilenumbrüche ignoriert werden.

  • Wenn Ihr Syntaxfehler nicht über das Web übertragen wird : Es kommt vor, dass auf Ihrem Computer ein Syntaxfehler vorliegt. Wenn Sie jedoch dieselbe Datei online veröffentlichen, wird sie nicht mehr angezeigt. Was nur eines von zwei Dingen bedeuten kann:

    • Sie sehen die falsche Datei!

    • Oder Ihr Code enthielt unsichtbaren streunenden Unicode (siehe oben). Sie können es leicht herausfinden: Kopieren Sie einfach Ihren Code aus dem Webformular zurück in Ihren Texteditor.

  • Überprüfen Sie Ihre PHP-Version . Nicht alle Syntaxkonstrukte sind auf jedem Server verfügbar.

    • php -v für den Befehlszeileninterpreter

    • <?php phpinfo(); für den über den Webserver aufgerufenen.


    Das ist nicht unbedingt dasselbe. Insbesondere wenn Sie mit Frameworks arbeiten, werden Sie diese aufeinander abstimmen.

  • Verwenden Sie die reservierten Schlüsselwörter von PHP nicht als Bezeichner für Funktionen / Methoden, Klassen oder Konstanten.

  • Versuch und Irrtum ist Ihr letzter Ausweg.

Wenn alles andere fehlschlägt, können Sie Ihre Fehlermeldung jederzeit googeln . Die Suche nach Syntaxsymbolen ist nicht so einfach (der Stapelüberlauf selbst wird von SymbolHound indiziert ). Daher kann es einige Wochen dauern, bis Sie etwas Relevantes gefunden haben.

Weitere Anleitungen:

Weißer Bildschirm des Todes

Wenn Ihre Website nur leer ist, ist normalerweise ein Syntaxfehler die Ursache. Aktivieren Sie ihre Anzeige mit:

  • error_reporting = E_ALL
  • display_errors = 1

In Ihrem php.iniallgemeinen oder via .htaccessfür mod_php oder sogar.user.ini mit FastCGI-Setups.

Das Aktivieren innerhalb des fehlerhaften Skripts ist zu spät, da PHP nicht einmal die erste Zeile interpretieren / ausführen kann. Eine schnelle Problemumgehung besteht darin, ein Wrapper-Skript zu erstellen, z. B test.php.:

<?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 ist auch hilfreich, PHPs zu aktivieren error_logund die Webserver zu überprüfen,error.log wenn ein Skript mit HTTP 500-Antworten abstürzt.

Mario
quelle
error_reporting(E_ALL | E_STRICT);für frühere Versionen von PHP
Geo
2
Einige IDEs (wie NetBeans) unterstützen nicht nur die Syntaxhervorhebung, sondern auch die Codeformatierung. Wenn Sie es sich zur Gewohnheit machen, Ihren Code richtig zu formatieren und die IDE von Zeit zu Zeit um eine Neuformatierung zu bitten, können Probleme wie nicht übereinstimmende geschweifte Klammern auftreten.
Josep Valls
115

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

Die Verwendung einer Syntaxprüfungs-IDE bedeutet:

Sie werden (effektiv) nie wieder auf Syntaxfehler stoßen, einfach weil Sie sie während der Eingabe richtig sehen. Ernsthaft.

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

  1. NetBeans [kostenlos]
  2. PHPStorm [$ 199 USD]
  3. Eclipse mit PHP Plugin [kostenlos]
  4. Sublime [$ 80 USD] (hauptsächlich ein Texteditor, aber erweiterbar mit Plugins wie PHP Syntax Parser )
Sliq
quelle
2
Es ist offensichtlich. Können Sie jedoch, wenn Sie IDEs hier erneut auflisten, etwas näher erläutern, wo sie sich in ihrer Syntax-Nützlichkeit unterscheiden? Sublime ist meistens ein Editor, keine IDE; aber dann hübscher und bissiger; macht in erster Linie nur Syntax-Highlighing, ist aber auch beim Bracket-Matching wahr. Im Gegensatz zu PHPStorm werden T_CONSTANT_AND_ENCAPSED-Fehler beispielsweise im Gegensatz zu PHPStorm leicht sofort erkannt. Dies führt jedoch zu verschnörkelten Linien bei Inline-Fehlern. Die Syntaxhinweise von NetBeans waren früher sogar kryptischer als PHPs (erneutes Auflisten zulässiger Konstrukte). Können Sie Ihre Erfahrungen mit Vor- und Nachteilen teilen? ist deine Lieblings-Eclipse / PDT oder ..?
Mario
@mario Ich denke, Sie sind wirklich tief in das Thema vertieft, also möchte ich hier wirklich nichts Falsches sagen, aber der gesamte Code, den ich (und meine Teamkollegen, Freunde, die Code schreiben, freiberufliche Partner) jemals in einer IDE geschrieben haben, wurde nie ausgeführt mit einem Syntaxfehler. Daher denke ich, dass zumindest die Syntaxprüfung von Netbeans / PHPStorm äußerst leistungsfähig ist. Aber vielleicht habe ich Ihre Frage falsch verstanden. Gib mir ein paar Stunden ...;)
Sliq
Ihre Antwort ist bereits genau richtig. Würde 99% unserer Fragen passen. Für den Kontext hier möchte ich jedoch eine Abwägung, bei der IDE die neueren Tooltips bereitstellt . Es ist wahrscheinlich unbedeutend für uns, Färbung und schnörkellose Linien sind ausreichend, wenn Sie sich genug auskennen. Aber ich gehe davon aus, dass die Unterschiede für Anfänger bedeutender sein könnten.
Mario
Manchmal ist eine IDE keine praktikable Option. Zum Beispiel schnelle Änderungen an einem WordPress-Theme oder Plugin. Ja, ich könnte den gesamten Code in eine IDE kopieren, aber dann muss ich ihn öffnen, dort einfügen, Header setzen und all die andere Zeit damit verschwenden, wenn ich nur auf eine schnelle Bearbeitung hoffe. Wenn Sie neue Funktionen entwickeln oder von vorne beginnen, tun Sie dies in einer IDE. Sie werden es nicht bereuen, sich zu Beginn etwas mehr Zeit genommen zu haben, um es einzurichten.
1934286
Ich sehe IDE als Trailer, nicht nur als Werkzeugkasten. Möglicherweise wird es nicht behoben, aber es kann Ihnen helfen, Syntaxfehler zu finden und zu verhindern. Viele Antworten hier scheinen zu sagen, dass Sie, wenn Sie Ihren Code sauber halten, weniger Chancen haben, einen Fehler zu machen, und leichter zu erkennen sind. Nun, mit automatischer Einrückung, Codehinweisen, variablem Auftreten, automatisch schließenden Klammern und automatischer Formatierung erspart ich mir viele Tippfehler pro Tag und ist der Hauptvorteil, warum ich einen verwende. Dies zählt nicht alles andere, was über den Rahmen dieser Frage hinausgeht (Debugger, Datenbank-Connector, Uml-Diagramm usw.). Die IDE spart Ihnen Zeit und verhindert mehr als nur Syntaxfehler.
Louis Loudog Trottier
58

Unerwartet [

Heutzutage tritt die unerwartete [Array-Klammer häufig bei veralteten PHP-Versionen auf. Die kurze Array-Syntax ist verfügbar, da PHP > = 5.4 . Ältere Installationen unterstützen nur array().

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

Die Dereferenzierung der Array-Funktionsergebnisse ist für ältere PHP-Versionen ebenfalls 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 nachforschen, ob z. B. SetHandler php56-fcgieine neuere Laufzeit möglich ist.

Siehe auch:

Übrigens gibt es auch Präprozessoren und PHP 5.4-Syntax- Downkonverter, wenn Sie mit älteren + langsameren PHP-Versionen wirklich anhänglich sind.

Andere Ursachen für unerwartete[ Syntaxfehler

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

  • Sie können keine Array-Eigenschaftsdeklarationen / -ausdrücke in Klassen verwenden , auch nicht in PHP 7.

    protected $var["x"] = "Nope";
                  
  • Das Verwechseln [mit dem Öffnen von geschweiften Klammern {oder 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 interpretiert PHP das constals konstanten Namen.

    Wenn Sie auf eine Array-Variable zugreifen wollten (was hier die typische Ursache ist), fügen Sie das führende $Siegel hinzu - so wird es zu einem $varname.

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

    global $var['key'];


Unerwartetes ] Schließen der eckigen Klammer

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

  • Wiederum sind Fehlpaarungen mit )Klammern oder }geschweiften Klammern häufig:

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

    $var = 2];

    Dies tritt häufig in mehrzeiligen und verschachtelten Array-Deklarationen auf.

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

    Verwenden Sie in diesem Fall Ihre IDE für die Klammerübereinstimmung, um einen vorzeitigen ]Array-Abschluss zu finden . Verwenden Sie zumindest mehr Abstände und Zeilenumbrüche, um sie einzugrenzen.

Mario
quelle
Der Link 'PHP 5.4 Syntax Down-Converter' github.com/IonutBajescu/short-arrays-to-long-arrays oben ist defekt.
Danimal Reks
46

Unerwartetes T_VARIABLE

Ein "unerwartetes T_VARIABLE" bedeutet, dass es ein Literal gibt$variable , der nicht in die aktuelle Ausdrucks- / Anweisungsstruktur passt.

absichtlich abstrakter / ungenauer Operator + $ Variablendiagramm

  1. fehlendes Semikolon

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

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

    Ein häufiges Missgeschick sind Verkettungen von Zeichenfolgen mit vergessenen .Operatoren:

                                   
    print "Here comes the value: "  $value;

    Übrigens sollten Sie die Zeichenfolgeninterpolation (Basisvariablen in doppelten Anführungszeichen) bevorzugen, wenn dies die Lesbarkeit verbessert. Dadurch werden diese Syntaxprobleme vermieden.

    Die String-Interpolation ist eine Kernfunktion der Skriptsprache . Keine Schande, es zu benutzen. Ignorieren Sie alle Hinweise zur Mikrooptimierung, dass die .Verkettung von 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 erraten , ob die Variable hinzugefügt, subtrahiert oder verglichen werden sollte usw.

  4. Listen

    Gleiches gilt für Syntaxlisten wie in Array-Populationen, in 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)

    Entsprechend sehen Sie dies mit listoder globalAnweisungen oder wenn ein ;Semikolon in einer forSchleife fehlt .

  5. Klassenerklärungen

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

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

    }Insbesondere unübertroffene schließende geschweifte Klammern können hier führen. Wenn eine Methode zu früh beendet wird (verwenden Sie den richtigen Einzug!), Wird eine Streuvariable häufig falsch in den Klassendeklarationskörper eingefügt.

  6. Variablen nach Bezeichnern

    Sie können auch niemals eine Variable direkt einem Bezeichner folgen lassen :

                 
    $this->myFunc$VAR();

    Übrigens ist dies ein häufiges Beispiel, bei dem die Absicht bestand, möglicherweise variable Variablen zu verwenden . In diesem Fall beispielsweise eine Suche $this->{"myFunc$VAR"}();nach variablen Eigenschaften mit .

    Beachten Sie, dass die Verwendung variabler Variablen die Ausnahme sein sollte. Neulinge versuchen oft, sie zu beiläufig zu verwenden, selbst wenn Arrays einfacher und angemessener wären.

  7. Fehlende Klammern nach Sprachkonstrukten

    Hastiges Tippen kann dazu führen, dass Klammern für ifund forund foreachAnweisungen vergessen werden :

           
    foreach $array as $key) {

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

                          
    if ($var = pdo_query($sql) {
         $result = 

    Die geschweifte {Klammer öffnet den Codeblock nicht, ohne den ifAusdruck zuerst mit der )schließenden Klammer zu schließen.

  8. Sonst erwartet keine Bedingungen

         
    else ($var >= 0)

    Lösung: Entfernen Sie die Bedingungen aus elseoder verwenden Sie elseif.

  9. Benötigen Sie Klammern zum Schließen

         
    function() uses $var {}

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

  10. Unsichtbares Leerzeichen

    Wie in der Referenzantwort zu "Unsichtbarer streunender Unicode" (z. B. ein nicht unterbrechendes Leerzeichen ) erwähnt, wird dieser Fehler möglicherweise auch bei ahnungslosem Code angezeigt:

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

    Es ist eher am Anfang von Dateien und beim Kopieren und Einfügen von Code verbreitet. Überprüfen Sie mit einem Hexeditor, ob Ihr Code visuell kein Syntaxproblem enthält.

Siehe auch

Mario
quelle
32

Unerwartetes T_CONSTANT_ENCAPSED_STRING
Unerwartetes T_ENCAPSED_AND_WHITESPACE

Die sperrigen Namen T_CONSTANT_ENCAPSED_STRINGund T_ENCAPSED_AND_WHITESPACEauf Angaben beziehen sich Literale ."string"

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

  1. Falsche Variableninterpolation

    Und es kommt am häufigsten bei falscher PHP-Variableninterpolation vor:

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

    Das Zitieren von Arrays-Schlüsseln ist im PHP-Kontext ein Muss. Bei doppelt zitierten Zeichenfolgen (oder HEREDOCs) ist dies jedoch ein Fehler. Der Parser beschwert sich über das enthaltene einfache Anführungszeichen 'string', da er dort normalerweise einen Literalbezeichner / Schlüssel erwartet.

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

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

    Verschachtelte Arrays oder tiefere Objektreferenzen erfordern jedoch die komplexe Syntax des Ausdrucks für geschweifte Zeichenfolgen :

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

    Wenn Sie sich nicht sicher sind, ist dies in der Regel sicherer. Es wird oft sogar als besser lesbar angesehen. Und bessere IDEs verwenden dafür tatsächlich eine unterschiedliche Syntaxfärbung.

  2. Fehlende Verkettung

    Wenn eine Zeichenfolge einem Ausdruck folgt, jedoch keine Verkettung oder kein anderer Operator vorhanden ist, wird PHP sich über das Zeichenfolgenliteral beschweren:

                           
    print "Hello " . WORLD  " !";

    Obwohl es für Sie und mich offensichtlich ist, kann PHP einfach nicht erraten, dass die Zeichenfolge dort angehängt werden sollte.

  3. Verwirrende Anführungszeichen für Zeichenfolgen

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

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

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

    Tipp : Stellen Sie Ihren Editor / Ihre IDE so ein, dass für Zeichenfolgen mit einfachen und doppelten Anführungszeichen eine leicht unterschiedliche Farbgebung verwendet wird. (Es hilft auch bei der Anwendungslogik, z. B. Zeichenfolgen in doppelten Anführungszeichen für die Textausgabe und Zeichenfolgen in einfachen Anführungszeichen nur für konstanten Werte zu bevorzugen.)

    Dies ist ein gutes Beispiel, bei dem Sie nicht in erster Linie aus doppelten Anführungszeichen ausbrechen sollten. Verwenden Sie stattdessen einfach die richtigen \"Escapezeichen für die Anführungszeichen der HTML-Attribute:

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

    Dies kann zwar auch zu einer Verwirrung der Syntax führen, aber alle besseren IDEs / Editoren helfen erneut, indem sie die maskierten Anführungszeichen unterschiedlich einfärben.

  4. Fehlendes Eröffnungszitat

    Gleichermaßen vergessen vergessen,"' ein Rezept für Parserfehler zu öffnen / zu zitieren :

                   
     make_url(login', 'open');

    Hier ', 'würde das nach einem Barwort ein String-Literal werden, wenn es offensichtlich loginein String-Parameter sein sollte.

  5. Array-Listen

    Wenn Sie ,in einem Array-Erstellungsblock ein Komma verpassen , 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 jedoch unverzeihlich ist. Was ohne Syntaxhervorhebung schwer zu entdecken ist.

  6. Funktionsparameterlisten

    Das Gleiche gilt für Funktionsaufrufe :

                             
    myfunc(123, "text", "and"  "more")
  7. Ausreißer

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

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

    Hier beschwert sich PHP über zwei direkt aufeinanderfolgende String-Literale. Aber die wahre Ursache ist natürlich die nicht geschlossene vorherige Zeichenfolge.

Siehe auch

Mario
quelle
27

Unerwarteter T_STRING

T_STRINGist ein bisschen eine Fehlbezeichnung. Es bezieht sich nicht auf ein Zitat "string". Dies bedeutet, dass eine Rohkennung gefunden wurde. Dies kann von bareWörtern über übrig gebliebene CONSTANToder Funktionsnamen, vergessene nicht zitierte Zeichenfolgen bis hin zu einfachem Text reichen .

  1. Falsch zitierte Zeichenfolgen

    Dieser Syntaxfehler tritt jedoch am häufigsten bei falsch zitierten Zeichenfolgenwerten auf. Jedes Entkommen und Verirren "oder 'Zitat bildet einen ungültigen Ausdruck:

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

    Das Hervorheben der Syntax macht solche Fehler sehr offensichtlich. Es ist wichtig, sich daran zu erinnern, Backslashes zu verwenden, um \"doppelte oder \'einfache Anführungszeichen zu vermeiden - je nachdem, welches als String-Gehäuse verwendet wurde .

    • Der Einfachheit halber sollten Sie äußere 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 dann jedoch darauf, dass kein Literal angezeigt wird " doppelten Anführungszeichen angezeigt werden.
    • Für eine längere Ausgabe bevorzugen Sie mehrere echo/ printZeilen, anstatt ein- und auszublenden. Betrachten Sie noch besser einen HEREDOC- Abschnitt.

    Ein weiteres Beispiel ist die Verwendung eines PHP-Eintrags in HTML-Code, der mit PHP generiert wurde:

    $text = '<div>some text with <?php echo 'some php entry' ?></div>'

    Dies geschieht, wenn $textes mit vielen Zeilen groß ist und der Entwickler nicht den gesamten Wert der PHP-Variablen sieht und sich auf den Code konzentriert, der seine Quelle vergisst. Beispiel ist hier

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

  2. Nicht geschlossene Saiten

    Wenn Sie einen Abschluss verpassen, tritt" ein Syntaxfehler normalerweise später auf. Eine nicht abgeschlossene Zeichenfolge verbraucht häufig ein bisschen Code bis zum nächsten beabsichtigten Zeichenfolgenwert:

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

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

  3. Nicht programmierende Anführungszeichen

    Wenn Sie Code aus einem Blog oder einer Website kopieren und einfügen , wird manchmal ungültiger Code angezeigt. Typografische Anführungszeichen entsprechen nicht den Erwartungen von PHP:

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

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

  4. Das fehlende Semikolon; nochmal

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

           
    func1()
    function2();

    PHP kann einfach nicht wissen, ob Sie zwei Funktionen nacheinander ausführen wollten oder ob Sie ihre Ergebnisse multiplizieren, hinzufügen, vergleichen oder nur die eine ||oder andere ausführen wollten .

  5. Kurze geöffnete Tags und <?xmlHeader 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 beginnen :

          
    <?xml version="1.0"?>

    PHP wird das sehen <? und es für sich zurückfordern. Es wird nicht verstehen, wofür der Streuner xmlgedacht war. Es wird als konstant interpretiert. Aber das versionwird 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 äußerst abscheuliche Ursache für Syntaxfehler sind Unicode-Symbole, z. B. das nicht unterbrechende Leerzeichen . PHP erlaubt Unicode-Zeichen als Bezeichnernamen. Wenn Sie eine T_STRING-Parser-Beschwerde für völlig ahnungslosen Code erhalten, wie:

    <?php
        print 123;

    Sie müssen einen anderen Texteditor ausbrechen. Oder sogar ein Hexeditor. Was hier wie einfache Leerzeichen und Zeilenumbrüche aussieht, kann unsichtbare Konstanten enthalten. Java-basierte IDEs bemerken manchmal nicht, dass eine UTF-8-Stückliste innerhalb von Leerzeichen mit Nullbreite, Absatztrennzeichen usw. beschädigt ist. Versuchen Sie, alles erneut zu bearbeiten, Leerzeichen zu entfernen und normale Leerzeichen wieder hinzuzufügen.

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

    <?php
        ;print 123;

    Das zusätzliche ;Semikolon hier konvertiert das vorhergehende unsichtbare Zeichen in eine undefinierte konstante Referenz (Ausdruck als Anweisung). Was PHP im Gegenzug zu einem hilfreichen Hinweis macht.

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

    Dies ist ein häufiger Fehler, wenn der PHP-Code aus Code "übersetzt" wurde, der in einer anderen Sprache (C, Java, JavaScript usw.) geschrieben wurde. In solchen Fällen kann sich auch eine Deklaration des Variablentyps (wenn der ursprüngliche Code in einer Sprache geschrieben wurde, die typisierte Variablen verwendet) herausschleichen und diesen Fehler erzeugen.

  8. Entkommene Anführungszeichen

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

    Beispiel: echo 'Jim said \'Hello\'';wird gedrucktJim said 'hello'

    Wenn Sie dem schließenden Anführungszeichen einer Zeichenfolge entkommen, wird das abschließende Anführungszeichen wörtlich und nicht wie beabsichtigt verwendet, dh als druckbares Anführungszeichen als Teil der Zeichenfolge und nicht als schließende Zeichenfolge. Dies wird häufig als Analysefehler angezeigt, nachdem Sie die nächste Zeichenfolge oder am Ende des Skripts geöffnet haben.

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

Mario
quelle
18

Unerwartet (

Das Öffnen von Klammern folgt normalerweise Sprachkonstrukten wie if/ foreach/ for/ array/ listoder startet einen arithmetischen Ausdruck. Sie sind syntaktisch falsch nach "strings", nach einem vorherigen (), einem einsamen $und in einigen typischen Deklarationskontexten.

  1. Funktionsdeklarationsparameter

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

    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 frei verwenden können whatever(1+something()*2), usw.

  2. Standardeinstellungen für Klasseneigenschaften

    Gleiches gilt für Klassenmitgliedsdeklarationen , bei denen nur Literal- / Konstantenwerte zulässig sind, keine Ausdrücke:

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

    Setzen Sie solche Dinge in den Konstruktor. Siehe auch Warum erlauben PHP-Attribute keine Funktionen?

    Beachten Sie erneut, dass PHP 7 dort nur var $xy = 1 + 2 +3;konstante Ausdrücke zulässt .

  3. JavaScript-Syntax in PHP

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

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

    In diesem Fall wird normalerweise eine nicht abgeschlossene vorhergehende Zeichenfolge angezeigt. und Literalabschnitte <script>, die in den PHP-Code-Kontext gelangen.

  4. isset (()), leer, Schlüssel, weiter, aktuell

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

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

    Gleiches gilt für alle Sprachkonstrukte, die impliziten Zugriff auf Variablennamen erfordern. Diese integrierten Funktionen sind Teil der Sprachgrammatik und erlauben daher keine dekorativen zusätzlichen Klammern.

    Funktionen auf Benutzerebene, die eine Variablenreferenz erfordern, aber ein übergebenes Ausdrucksergebnis erhalten, führen stattdessen zu Laufzeitfehlern.


Unerwartet )

  1. Fehlender Funktionsparameter

    In einem Funktionsaufruf dürfen keine Streukommas zuletzt stehen . PHP erwartet dort einen Wert und beschwert sich daher über eine früh schließende )Klammer.

                  
    callfunc(1, 2, );

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

  2. Unvollendete Ausdrücke

    Wenn Sie etwas in einem arithmetischen Ausdruck vergessen, gibt der Parser auf. Denn wie sollte es das möglicherweise interpretieren:

                   
    $var = 2 * (1 + );

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

  3. Foreach as constant

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

                           
    foreach ($array as wrong) {

    PHP hier sagt Ihnen manchmal, dass es ::stattdessen ein erwartet . Weil eine class :: $ -Variable den erwarteten $ variable-Ausdruck erfüllt haben könnte.


Unerwartet {

Geschweifte Klammern {und }Codeblöcke einschließen. Und Syntaxfehler weisen normalerweise auf eine falsche Verschachtelung hin.

  1. Nicht übereinstimmende Unterausdrücke in einem if

    Am häufigsten unausgeglichen (und) die Ursache, wenn sich der Parser darüber beschwert, dass die Öffnung {zu früh erscheint. Ein einfaches Beispiel:

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

    Zählen Sie Ihre Klammern oder verwenden Sie eine IDE, die Ihnen 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 Locken verwechseln, entspricht dies nicht der Sprachgrammatik:

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

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

  3. Variable Variablen oder geschweifte var-Ausdrücke

    Das ist ziemlich selten. Sie können aber auch Beschwerden für komplexe variable Ausdrücke erhalten {und }analysieren:

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

    }In solchen Kontexten besteht jedoch eine höhere Wahrscheinlichkeit für ein Unerwartetes .


Unerwartet }

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

  1. Letzte Anweisung in einem Codeblock

    Dies kann für jeden nicht abgeschlossenen Ausdruck passieren.

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

    function whatever() {
        doStuff()
    }            

    Hier kann der Parser nicht sagen, ob Sie + 25;dem Funktionsergebnis noch etwas hinzufügen möchten oder etwas anderes.

  2. Ungültige Blockverschachtelung / Vergessen {

    Manchmal wird dieser Parserfehler angezeigt, wenn ein Codeblock }zu früh geschlossen wurde oder Sie {sogar eine Öffnung vergessen haben :

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

    Im obigen Ausschnitt hatte der ifkeine öffnende {geschweifte Klammer. Somit wurde der abschließende }unten überflüssig. Und deshalb war das nächste Schließen }, das für die Funktion vorgesehen war, nicht mit der ursprünglichen öffnenden {geschweiften Klammer verbunden.

    Solche Fehler sind ohne richtigen Codeeinzug noch schwerer zu finden. Verwenden Sie eine IDE und eine Klammerübereinstimmung.


Unerwartet {, erwartend(

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

  1. Parameterlisten

    Beispielsweise sind falsch deklarierte Funktionen ohne Parameterliste nicht zulässig:

                     
    function whatever {
    }
  2. Bedingungen für Steueranweisungen

    Und Sie können auch nicht ifohne Bedingung haben .

      
    if {
    }

    Was natürlich keinen Sinn ergibt. Das Gleiche gilt für die üblichen Verdächtigen, for/ foreach, while/ dousw.

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

Mario
quelle
1
Ich suchte nach einer Antwort auf meine Frage in diesem Beitrag, fand aber selbst eine Antwort auf das Problem - "Unerwartet {", deshalb wollte ich es mit meiner Antwort teilen - für mich war das Problem die Zeilenumbruchcodierung - irgendwie ein Teil von mir Dateien verwendeten Macintosh-Zeilenumbrüche, aber als ich sie in Windows-Zeilenumbrüche änderte, wurde mein Problem (auf localhost (WAMP) funktioniert alles, aber auf dem Linux-Webserver nicht) behoben.
Edgars Aivars
@EdgarsAivars Danke für deinen Kommentar! Plattformspezifische Zeilenumbrüche sind in der Tat ein ungewöhnliches und heikles Problem. Ich werde es wahrscheinlich auch hier erwähnen. (Es wurde nur als beiseite in der anderen Referenzantwort erwähnt .)
Mario
Ich habe festgestellt, dass Unexpected} darauf zurückzuführen ist, dass ein Teil meines Codes das PHP-Short-Tag <? statt <? php - habe ich eine Weile gebraucht, um dieses zu finden, da es auf anderen Servern funktioniert hat.
c7borg
14

Unerwartetes $ Ende

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

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

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

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

  • Verwenden Sie eine IDE mit Bracket Matching, um herauszufinden, wo das nicht }stimmt. In den meisten IDEs und Texteditoren gibt es Tastaturkürzel:

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

Die meisten IDEs markieren auch übereinstimmende Klammern, Klammern und Klammern. Das macht es ziemlich einfach, ihre Korrelation zu überprüfen:

Bracket Matching in einer IDE

Nicht abgeschlossene Ausdrücke

Und Unexpected $endSyntax / Parser - Fehler kann auch für ungekündigten Ausdrücke oder Aussagen auftreten:

  • $var = func(1, ?>EOF

Schauen Sie sich also zuerst das Ende der Skripte an. Ein Trailing ;ist für die letzte Anweisung in einem PHP-Skript häufig redundant. Aber du solltest einen haben. Gerade weil es solche Syntaxprobleme eingrenzt.

Eingedrückte HEREDOC-Marker

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

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 Syntax-Hervorhebungs-Editoren machen dies deutlich oder warnen davor.

Entkommene Anführungszeichen

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

Beispiel: echo 'Jim said \'Hello\'';wird gedrucktJim said 'hello'

Wenn Sie dem schließenden Anführungszeichen einer Zeichenfolge entkommen, wird das abschließende Anführungszeichen wörtlich und nicht wie beabsichtigt verwendet, dh als druckbares Anführungszeichen als Teil der Zeichenfolge und nicht als schließende Zeichenfolge. Dies wird häufig als Analysefehler angezeigt, nachdem Sie die nächste Zeichenfolge oder am Ende des Skripts geöffnet haben.

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

Alternative Syntax

Etwas seltener können Sie diesen Syntaxfehler sehen, wenn Sie die alternative Syntax für Anweisungs- / Codeblöcke in Vorlagen verwenden. Verwenden Sie if:und else:und ein fehlt endif;zum Beispiel.

Siehe auch:

Mario
quelle
14

Unerwartetes T_IF
Unerwartetes T_ELSEIF
Unerwartetes T_ELSE
Unerwartetes T_ENDIF

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

Geben Sie hier die Bildbeschreibung ein

  1. Fehlende {oder }falsche Einrückung

    Nicht übereinstimmende Codeklammern treten häufig bei weniger gut formatiertem Code auf, z.

    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, beginnen Sie neu! Andernfalls kann es weder für Sie noch für andere Personen behoben werden. Es macht keinen Sinn, dies im Internet zu präsentieren, um um Hilfe zu bitten.

    Sie können das Problem nur beheben, wenn Sie die verschachtelte Struktur und Beziehung der if / else-Bedingungen und ihrer {Codeblöcke visuell verfolgen können }. Verwenden Sie Ihre IDE, um festzustellen, ob alle gepaart sind.

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

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

    Abgesehen von der Konsistenz erweist es sich hier als hilfreich, auch langwierige Bedingungen zu vermeiden. Verwenden Sie temporäre Variablen oder Funktionen, um unlesbare ifAusdrücke zu vermeiden .

  2. IF kann nicht in Ausdrücken verwendet werden

    Ein überraschend häufiger Fehler eines Neulings ist der Versuch, eine ifAnweisung in einem Ausdruck zu verwenden, z. B. 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 stellen Sie Ihre Bedingungen vor:

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

    Das Definieren von Funktionen oder Methoden für solche Fälle ist oft auch sinnvoll.

    Steuerblöcke geben keine "Ergebnisse" zurück

    Dies ist zwar weniger häufig, aber einige Programmierer versuchen sogar, so zu behandeln, ifals ob ein Ergebnis zurückgegeben werden könnte :

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

    Dies ist strukturell identisch mit der Verwendung ifinnerhalb einer Zeichenfolgenverkettung / eines Ausdrucks.

    • Aber Kontrollstrukturen (wenn / foreach / while) nicht über ein „Ergebnis“ .
    • Die wörtliche Zeichenfolge "true" wäre auch nur eine nichtige Aussage.

    Sie müssen eine Zuordnung im Codeblock verwenden :

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

    Alternativ können Sie auf einen ?:ternären Vergleich zurückgreifen .

    Wenn in Wenn

    Sie können auch keineif innerhalb einer Bedingung verschachteln :

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

    Was offensichtlich überflüssig ist, weil das and(oder or) bereits Verkettungsvergleiche erlaubt.

  3. Vergessene ;Semikolons

    Noch einmal: Jeder Steuerblock muss eine Anweisung sein. Wenn das vorherige Codeteil nicht durch ein Semikolon abgeschlossen wird, ist dies ein garantierter 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 den if ()Ausdruck; damit beenden , wird eine void-Anweisung ausgeführt. Das ;wird ein {}Eigenes!
    • Der {…}Block ist somit vom gelöst ifund würde immer laufen.
    • Das hatte also elsekeine Beziehung mehr zu einem offenen ifKonstrukt, weshalb dies zu einem unerwarteten T_ELSE-Syntaxfehler führen würde.

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

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

    Wobei der ;Codeblock nach dem Code {…}das gesamte if Konstrukt beendet und den elseZweig syntaktisch trennt .

  5. Keine Codeblöcke verwenden

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

    Es ist jedoch sehr wahrscheinlich, dass dies die Syntax beeinträchtigt. Früher oder später finden zusätzliche Anweisungen Eingang in die if / else-Zweige:

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

    Aber tatsächlich Codeblöcke verwenden zu können, müssen zu schreiben {... }sie als solche!

    Selbst erfahrene Programmierer vermeiden diese spannungslose Syntax oder verstehen sie zumindest als außergewöhnliche Ausnahme von der Regel.

  6. Sonst / 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, müssen aber elsezuletzt gehen . Ist einfach so.

  7. Klassenerklärungen

    Wie oben erwähnt , können Sie in einer Klassendeklaration keine Steueranweisungen haben:

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

    Sie haben entweder eine Funktionsdefinition vergessen oder }in solchen Fällen eine zu früh geschlossen .

  8. Unerwartetes T_ELSEIF / T_ELSE

    Beim Mischen von PHP und HTML muss sich das Schließen }für a if/elseifim selben PHP-Block <?php ?>wie das nächste befinden elseif/else. Dies führt zu einem Fehler, da das Schließen }für die ifAnforderungen Teil von elseif:

    <?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 falscher Einrückungen - vermutlich oft aufgrund falscher Codierungsabsichten.
    Sie können keine anderen Anweisungen zwischen if und elseif/ oder elsestrukturellen Token mischen:

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

    Beides kann nur in {…}Codeblöcken auftreten, nicht zwischen Kontrollstruktur-Token.

    • Das würde sowieso keinen Sinn ergeben. Es ist nicht so, dass es einen "undefinierten" Zustand gab, wenn PHP zwischen ifund elseZweigen springt .
    • Sie müssen sich entscheiden, wo Druckanweisungen zu / gehören oder ob sie in beiden Zweigen wiederholt werden müssen.

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

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

    Es gibt keine syntaktische Beziehung zwischen ifund else. Der foreachlexikalische Bereich endet bei }, sodass es keinen Sinn macht, die ifStruktur fortzusetzen.

  9. T_ENDIF

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

    • Eine häufige Gefahr besteht darin, den unheimlich ähnlichen :Doppelpunkt mit einem ;Semikolon zu verwechseln . (In "Semikolon zu früh" behandelt)

    • Da Einrückungen in Vorlagendateien schwieriger zu verfolgen sind, gilt dies umso mehr, wenn Sie die alternative Syntax verwenden. Es ist plausibel, dass Sie mit endif;keiner übereinstimmen if:.

    • Die Verwendung } endif; ist ein Doppelterminator if .

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

  10. Zuordnung vs. Vergleich

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

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

    Das ist kein ==/ ===Vergleich, sondern eine =Aufgabe . Dies ist ziemlich subtil und führt einige Benutzer leicht dazu, ganze Bedingungsblöcke hilflos zu bearbeiten. Achten Sie zuerst auf unbeabsichtigte Aufgaben - wenn Sie einen logischen Fehler / ein falsches Verhalten feststellen.

Mario
quelle
11

Unerwartet T_IS_EQUAL
Unerwartet T_IS_GREATER_OR_EQUAL
Unerwartet T_IS_IDENTICAL
Unerwartet T_IS_NOT_EQUAL
Unerwartet T_IS_NOT_IDENTICAL
Unerwartet T_IS_SMALLER_OR_EQUAL
Unerwartet <
Unerwartet>

Vergleichsoperatoren wie ==, >=, ===, !=, <>, !==und <=oder <und >vor allem sollten nur in Ausdrücken, wie verwendet werden ifAusdrücke. Wenn sich der Parser über sie beschwert, bedeutet dies häufig eine falsche Schälung oder nicht übereinstimmende ( )Parens um sie herum.

  1. Parens Gruppierung

    Insbesondere bei ifAussagen mit mehreren Vergleichen müssen Sie darauf achten, die öffnende und schließende Klammer korrekt zu zählen :

                            
    if (($foo < 7) && $bar) > 5 || $baz < 9) { ... }
                          

    Hier wurde die ifBedingung hier bereits von der beendet)

    Sobald Ihre Vergleiche ausreichend komplex sind, hilft es oft, sie in mehrere und verschachtelte ifKonstrukte aufzuteilen .

  2. isset () mit Vergleichen vermischt

    Ein häufiger Neuling ist, dass Pitfal versucht, Vergleiche anzustellen isset()oder empty()zu vergleichen:

                            
    if (empty($_POST["var"] == 1)) {

    Oder auch:

                        
    if (isset($variable !== "value")) {

    Das macht keinen Sinn für PHP machen, weil issetund emptySprachkonstrukte sind , die nur Variablennamen akzeptieren. Es ist auch nicht sinnvoll, das Ergebnis zu vergleichen, da die Ausgabe nur / bereits ein Boolescher Wert ist.

  3. Verwechseln von >=größer oder gleich mit =>Array-Operator

    Beide Operatoren sehen sich etwas ähnlich, so dass sie manchmal durcheinander geraten:

             
    if ($var => 5) { ... }

    Sie müssen sich nur daran erinnern, dass dieser Vergleichsoperator " größer oder gleich " heißt, um ihn richtig zu machen.

    Siehe auch: If-Anweisungsstruktur in PHP

  4. Nichts zu vergleichen

    Sie können auch nicht zwei Vergleiche kombinieren, wenn sie denselben Variablennamen betreffen:

                     
    if ($xyz > 5 and < 100)

    PHP kann nicht ableiten, dass Sie die ursprüngliche Variable erneut vergleichen wollten. Ausdrücke werden normalerweise nach der Priorität des Operators gepaart , sodass zum Zeitpunkt der <Anzeige nur noch ein boolesches Ergebnis der ursprünglichen Variablen übrig bleibt.

    Siehe auch: unerwartet T_IS_SMALLER_OR_EQUAL

  5. Vergleichsketten

    Sie können nicht mit einer Variablen mit einer Reihe von Operatoren vergleichen:

                      
     $reult = (5 < $x < 10);

    Dies muss in zwei Vergleiche unterteilt werden, jeweils gegen $x.

    Dies ist eigentlich eher ein Fall von Ausdrücken auf der schwarzen Liste (aufgrund der äquivalenten Operatorassoziativität). Es ist syntaktisch in einigen Sprachen im C-Stil gültig, aber PHP würde es auch nicht als erwartete Vergleichskette interpretieren.

  6. Unerwartet >
    Unerwartet<

    Die Operatoren größer >oder kleiner als <haben keinen benutzerdefinierten T_XXXTokenizer-Namen. Und obwohl sie wie alle anderen verlegt werden können, beklagt sich der Parser häufiger über falsch zitierte Zeichenfolgen und gestampftes HTML:

                            
    print "<a href='z">Hello</a>";
                     ↑

    Dies bedeutet, dass eine Zeichenfolge "<a href='z"mit >einer Literalkonstante verglichen Hellound anschließend erneut <verglichen wird. Zumindest sieht PHP das so. Die eigentliche Ursache und der Syntaxfehler waren die vorzeitige "Beendigung der Zeichenfolge .

    Es ist auch nicht möglich, PHP-Start-Tags zu verschachteln:

    <?php echo <?php my_func(); ?>

Siehe auch:

Mario
quelle
11

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

Steuerkonstrukte wie if, foreach, for, while, list, global, return, do, print, echonur als Anweisungen verwendet werden kann. Sie wohnen normalerweise alleine in einer Leitung.

  1. Semikolon; wo bist du?

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

                 
    $x = myfunc()
    if (true) {

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

  2. Klassenerklärungen

    Ein weiterer Ort, an dem dies auftritt, sind Klassendeklarationen . Im Klassenabschnitt können Sie nur Eigenschaftsinitialisierungen und Methodenabschnitte auflisten. Dort darf sich kein Code befinden.

    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 sollen nicht in andere Ausdrücke eingefügt werden:

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

    Ebenso können Sie keine ifin Strings, mathematischen Ausdrücken oder anderswo verwenden:

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

    Um bestimmte ifBedingungen in einen Ausdruck einzubetten, möchten Sie häufig eine ?:ternäre Auswertung verwenden .

    Das gleiche gilt für for, while, global, echound ein geringeres Ausmaß list.

              
    echo 123, echo 567, "huh?";

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

  4. Reservierte Schlüsselwörter als Bezeichner

    Sie können auch keine dooder ifandere Sprachkonstrukte für benutzerdefinierte Funktionen oder Klassennamen verwenden. (Vielleicht in PHP 7. Aber selbst dann wäre es nicht ratsam.)

Mario
quelle
7

Unerwartetes '?'

Wenn Sie versuchen, den Null-Koaleszenz-Operator ??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 '?', Erwartete Variable

Ein ähnlicher Fehler kann für nullfähige Typen auftreten, wie in:

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

Dies weist wiederum darauf hin, dass eine veraltete PHP-Version verwendet wird (entweder die CLI-Version php -voder die an den Webserver gebundene phpinfo();).

John Conde
quelle
5

Unerwartetes T_LNUMBER

Das Token T_LNUMBERbezieht sich auf eine "lange" / Nummer.

  1. Ungültige Variablennamen

    In PHP und den meisten anderen Programmiersprachen können Variablen nicht mit einer Zahl beginnen. Das erste Zeichen muss alphabetisch oder ein Unterstrich sein.

    $1   // Bad
    $_1  // Good

    * *

    • Sehr häufig wird die Verwendung von preg_replacePlatzhaltern "$1"im PHP-Kontext verwendet:

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

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

    • Die gleiche Kennung constraint gilt für Objekteigenschaften , btw.

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

    • Amüsanterweise, aber sehr wenig empfohlen, erlaubt der PHP-Parser Unicode-Bezeichner. so dass $➊wäre gültig. (Im Gegensatz zu einem Literal 1).

  2. Streunender Array-Eintrag

    Ein unerwartetes langes 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 ;oder ,fehlt eine oder mehrere Listen oder Ausdrücke.

  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 unerwartete T_STRING- Fehler behandelt werden.

  4. Andere Bezeichner

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

             
    function 123shop() {

    Ziemlich genau wie bei Variablennamen.

Mario
quelle
2

Unerwartetes '='

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

Variablennamen folgen denselben 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 es folgendermaßen ausgedrückt: '[a-zA-Z_ \ x7f- \ xff] [a-zA-Z0-9_ \ x7f- \ xff] *'

John Conde
quelle
Gute Ergänzung John.
Funk Forty Niner
1

Unerwartetes 'Weiter' (T_CONTINUE)

continueist eine Anweisung (wie für oder wenn) und muss eigenständig erscheinen. Es kann nicht als Teil eines Ausdrucks verwendet werden. Zum Teil, weil continue keinen Wert zurückgibt, aber in einem Ausdruck muss jeder Unterausdruck einen Wert ergeben, damit der Gesamtausdruck zu einem Wert führt. Das ist der Unterschied zwischen einer Aussage und einem Ausdruck.

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

Unerwartete Pause (T_BREAK)

Gleiches gilt break;natürlich. Es ist auch nicht im Ausdruckskontext verwendbar, sondern eine strenge Anweisung (auf derselben Ebene wie foreachoder ein ifBlock).

Unerwartete 'Rückkehr' (T_RETURN)

Das mag überraschender sein return, aber das ist auch nur eine Aussage auf Blockebene . Es gibt zwar einen Wert (oder NULL) an den höheren Bereich / die höhere Funktion zurück, wird jedoch nicht als Ausdruck selbst ausgewertet. → Das heißt: Es macht keinen Sinn, dies zu tunreturn(return(false);;

Mario
quelle
1

Unerwartetes '.'

Dies kann auftreten, wenn Sie versuchen, den splat-Operator ( ...) in einer nicht unterstützten Version von PHP zu verwenden.

... wurde erstmals in PHP 5.6 verfügbar, um eine variable Anzahl von Argumenten für eine Funktion zu erfassen:

function concatenate($transform, ...$strings) {
    $string = '';
    foreach($strings as $piece) {
        $string .= $piece;
    }
    return($transform($string));
}

echo concatenate("strtoupper", "I'd ", "like ", 4 + 2, " apples");
// This would print:
// I'D LIKE 6 APPLES

In PHP 7.4 können Sie es für Array-Ausdrücke verwenden .

$parts = ['apple', 'pear'];
$fruits = ['banana', 'orange', ...$parts, 'watermelon'];
// ['banana', 'orange', 'apple', 'pear', 'watermelon'];
John Conde
quelle
0

Unerwartetes "Ende" (T_ENDWHILE)

Die Syntax verwendet einen Doppelpunkt. Wenn kein Doppelpunkt vorhanden ist, tritt der obige Fehler auf.

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

Die Alternative zu dieser Syntax ist die Verwendung von geschweiften Klammern:

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

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

mplungjan
quelle
0

Eine beginnende Fehlermeldung Parse error: syntax error, unexpected ':'kann dadurch verursacht werden, dass versehentlich eine statische Klassenreferenz Class::$Variableals geschrieben wird Class:$Variable.

David Spector
quelle