2012-03-29 11 views
8

Warum wird es nicht funktionieren? Erscheint Parse-Fehler: Syntaxfehler, unerwartete ':' ... on line 7wenn {} in if: endif

$a = 0; $b = 1; $c = 3; $d = 4; 
if ($a == $b): 
    if ($b == $c) { 
     // something 
    } 
else: 
    $c = $a; 
endif; 

Aber wenn ich es (nur hinzugefügt else-Anweisung) ändern:

$a = 0; $b = 1; $c = 3; $d = 4; 
if ($a == $b): 
    if ($b == $c) { 
     // something 
    } else { 
     // something 
    } 
else: 
    $c = $a; 
endif; 

Es funktioniert gut.

Warum ist das? ist es nicht ein PHP Bug? Oder es gibt eine Regel, wenn ... sonst sollte ich wissen?

Wie auch immer, ich benutze PHP 5.3.3 Version.

+0

Bitte geben Sie die Zeilennummern – JAM

+0

http://stackoverflow.com/questions/564130/difference-between-if-and-if-endif ein. – Pheonix

+4

Interessant - und eine gute Illustration, warum Sie den Templating-Stil-Flow wahrscheinlich nicht mischen sollten Steueranweisungen mit den regulären versteiften. (oder verwenden Sie den Templating-Stil _at all_ es sei denn, Sie codieren eine HTML-Ansicht ... aber das ist die Meinung) –

Antwort

14

Ich bin nicht sicher, ob ich nennen würde dies ein Fehler ist, aber ich glaube, dieses Problem bei Ihnen mit wegen eines dangling else, in Verbindung mit Ihrem gemischten if-else Syntax:

if ($a == $b):   // 1 
    if ($b == $c) {  // 2 
     // something  // 3 
    }      // 4 
else:      // 5 - this else 
    $c = $a;    // 6 
endif;     // 7 

Beachten Sie, wie Die else in Zeile 5 ist mehrdeutig: sie könnte entweder zur ersten oder zweiten if-Anweisung "gehören".

Sie können ganz einfach, dass die Mehrdeutigkeit entfernen und reparieren Ihre Syntaxfehler ein Semikolon nach dem durch Zugabe von verschachtelten if:

if ($a == $b):   // 1 
    if ($b == $c) {  // 2 
     // something  // 3 
    };     // 4 - here 
else:      // 5 
    $c = $a;    // 6 
endif;     // 7 

Auf einer anderen Anmerkung, benutzen Sie bitte diese Syntax nicht, wenn Sie Ihre Kollegen Programmierer wollen bludgeon Sie zu Tode im Schlaf.

+0

+1 für die Lols aus der Notiz – jprofitt

+0

Über was ich schreiben wollte. Nur besser. :) – GolezTrol

+0

Danke für deinen Rat. Ich werde die Syntax nicht mischen. Es ist nur ein kleines Wunder, das in Frage gestellt wird. – user1301744

1

Wie auf den PHP manual's control structure page in den Kommentaren erwähnt wird der Parser nicht immer davon ausgehen, dass eine if von einem Stil nicht mit einem else unter Verwendung des anderen abgestimmt werden sollte.

0

Die Doppelpunktform des If/Else kann bei verschachtelten ifs mehrdeutig sein. In Ihrem Beispiel wird dem else der zweite if angehängt (wie es sollte.) Um dies zu vermeiden, müssen Sie dem Interpreter explizit mitteilen, dass der else mit dem ersten if gepaart ist, entweder durch Hinzufügen eines else zu dem zweiten if (Wie Sie in Ihrem zweiten Codeblock anzeigen) oder verwenden Sie {}, um den Kontrollfluss explizit zu definieren.

Mit anderen Worten, Sie können mehrere Formen von if-Anweisungen verwenden. Zum Beispiel:

if (foo): 
    //statements 
else { 
    //statements 
} 

Ist vollkommen gültig. Ich würde zwar von Mischformen abraten, da es die Lesbarkeit wegnimmt.

Verwandte Themen