PHP Switch-Anweisung - Verständnisfrage

WulfmanGER

Commander
Registriert
Juli 2005
Beiträge
2.225
Hi

ich arbeite eigentlich recht gerne mit Switch-Anweisungen. Klappt recht gut. Jetzt hab ich aber einmal das break; vergessen und es passierte etwas was ich eigentlich später noch reinpappen wollte ganz automatisch mit ... ich weiß nur nicht warum

Hier mal das Script in der Fassung "falsch":

Code:
switch ($submenu) {
	case 'sammlungen':
	include 'listen_sammlungen.php';
	
	case 'sammlungen_update':
		include 'listen_sammlungen_update.php';
	break;
	default:
        // hier jetzt egal - div. Datenbankaufrufe, div-Container etc.
        break;

wie man sieht unter 'sammlungen' nach dem include - es fehlt das break;.

Mit Break breche ich die Switch-Anweisung sofort ab. Genau das soll auch passieren.
Ist hier natürlich nicht passiert. Es wurde danach sofort 'sammlungen_update' abgearbeitet!

Und genau das versteh ich nicht. Warum passierte das? Ich hätte jetzt eher gedacht das "default:" [unnötigerweise] abgearbeitet wird, aber es wurde das include bei sammlungen_update ausgeführt. Darf doch nur ausgeführt werden wenn in $submenu eben sammlungen_update steht? Aufgrund des fehlenden breaks wird die switch weiterabgearbeitet - ok verständlich ... dann müsste er aber bei DEFAULT "matchen" und default müsste abgearbeitet werden... war aber nicht.


So nebenbei hab ich aufgrund meines Fehlers aber gleich mein nächstes Todo auf der Liste erledigt .... Immer Update machen (ist keine Killer-App; steht in der DB bei einer Zeile eine 1, gibts kein update) -> Anzeige ... sah optisch nicht so schlimm aus und schiebe das include nun in das obere mit rein ;)

Gruß
 
Ist einfach so, bei fehlendem Break wird einfach weiter Linie für Linie abgearbeitet, bis zu einem Break.
Warum sollte er aus dem ersten Case ins Default springen. Der Code wird "von oben nach unten" verarbeitet, darum folgt ohne break einfach der nächste Case-Fall (und so weiter bis zu einem Break... oder auch nicht...).
 
It's not a bug, it's a feature.
PHP:
switch( $buchstabe )
{
  case 'a' :
  case 'e' :
  case 'i' :
  case 'o' :
  case 'u' :
    echo 'vokal';
    break;
  case 'ä' :
  case 'ö' :
  case 'ü' :
  case 'ß' :
    echo 'umlaut';
    break;
  default : echo 'anderer buchstabe';
}
 
@ 2fastHunter: Ist bei jeder Programmiersprache so... C, C++, C#, Java, PHP, ...
 
Also ich könnte schwören, dass bei C# schon der Compiler schimpft und es sich gar nicht übersetzen lässt :)
 
C# erlaubt es mehrere case-Anweisungen hintereinander zu schreiben, aber nach der ersten Anweisung ist ein case erst wieder nach einen break erlaubt.
 
2fastHunter schrieb:
Also ich könnte schwören, dass bei C# schon der Compiler schimpft und es sich gar nicht übersetzen lässt :)

Wenn ein fehlendes break einen Compilerfehler auslösen würde und somit nicht erlaubt ist, dann hätte man break doch garnicht erst in die Sprache einbauen müssen da man ja implizit bei jedem neuen case ein break annehmen kann.

Sprachkonstrukte, die absolut nichts bringen, außer bei ihrem Nichtvorhandensein einen Fehler auszulösen, sucht man in modernen sprachen zum glück vergebens.


joachim_n schrieb:
C# erlaubt es mehrere case-Anweisungen hintereinander zu schreiben, aber nach der ersten Anweisung ist ein case erst wieder nach einen break erlaubt.


Weißt du zufällig, bei welchen Sprachen das geht?
 
Zuletzt bearbeitet:
carom schrieb:
Weißt du zufällig, bei welchen Sprachen das geht?

Nach einer Anweisung ein neues case ohne break einzubringen? Z.b. in C/C++ geht das, führt aber oft zu unerwünschtem Verhalten. Meistens wurde das break halt vergessen und dann wird etwas mehr als gedacht ausgeführt.
 
Zurück
Oben