2016-01-27 3 views
6

ich die switch-Anweisung Syntaxfehler bei http://php.net/manual/en/control-structures.alternative-syntax.phpWarum in einer alternativen-Syntax switch-Anweisung der Ausgabe nicht einen Syntaxfehler verursacht

Meine IDE (PhpStorm) erfaßt, um die Fehler beschrieben kürzlich angetroffen, aber es all nützlichen Kontext nicht vorsah zur Korrektur. Der Code hat sicherlich einen schwerwiegenden Fehler bei der Aufnahme der Datei als Vorlage verursacht.

Die Warnung Anleitung Seite:


Warning Any output (including whitespace) between a switch statement and the first case will result in a syntax error. For example, this is invalid:

<?php switch ($foo): ?> 
    <?php case 1: ?> 
    ... 
<?php endswitch ?> 

Whereas this is valid, as the trailing newline after the switch statement is considered part of the closing ?> and hence nothing is output between the switch and case:

<?php switch ($foo): ?> 
<?php case 1: ?> 
    ... 
<?php endswitch ?> 

Das Handbuch Seite bietet keine Erklärung. Einige Benutzer comments on the page erklären auch nichts; Sie betonen einfach, dass Leerzeichen nicht erlaubt sind.

Warum ist das ein Syntaxfehler?

+6

Mindestens eine meiner Fragen klingt für mich wie "Warum ist' == 'zum Vergleich verwendet", die Antwort ist nur "weil die Syntax so definiert ist" ... –

+0

Ich denke, das stimmt , aber der Grund für den Vergleichsoperator ist, dass die Sprache einen braucht. Was ist der Grund für diese Qualität der Syntax? –

+1

Kurze Antwort ist, weil es ein Syntaxfehler ist .. Aber lange anwser wird zu lang sein und Vorbedingung ist Automata Theorie .. – ern

Antwort

12

Es ist einfach.

Es ist ein Syntaxfehler aus dem gleichen Grund, dass dies:

<?php 

$foo = 1; 
switch ($foo) { 
?> 
    This can't be here. 
    <?php 
    case 1: 
     echo "I'm one"; 
     break; 
    case 2: 
     echo "I'm two"; 
     break; 
} 

Daraus ergibt sich:

[27-Jan-2016 22:21:08 Europe/Berlin] PHP Parse error: syntax error, unexpected ' This can't be here.', expecting case (T_CASE) or default (T_DEFAULT) or '}' in /path/file on line 7

Das einzige, was ein switch ist ein case folgen kann. So funktioniert die Sprache.

Die Leerspezifische Einschränkung der alternativen Syntax ist einer der Gründe dafür, dass es ist die alternative Syntax: Es führt zu hässlichen Formatierung und es fehlt Einbuchtung, wo man normalerweise erwarten würde, es zu sehen.

+2

Das non-whitespace Beispiel lässt es zweifellos weniger verrückt erscheinen. Ist Ihr Beispiel gleichbedeutend mit 'switch ($ foo) { echo 'Dies kann nicht hier sein.'; Fall: .... '? –

+3

@SethBattin genau. Es ist im Wesentlichen das gleiche Problem. –

+0

Fair genug. Danke für die Antwort. –

Verwandte Themen