Die php Kontrollstruktur switch()
Melvin Cowznofski
- php
Hallo,
im php Manual steht bei der Kontrollstruktur switch():
"Erst wenn eine case Anweisung gefunden wird die dem Wert des an switch übergebenen Ausdrucks entspricht beginnt PHP tatsächlich die folgenden Anweisungen auszuführen." [...]
Dann verstehe ich nicht, wieso folgender Code zur Ausgabe von "foo" führt:
<?php
$var = 0;
switch($var)
{
case 'foo': $ausgabe = 'foo'; break;
case 'bar': $ausgabe = 'bar';
}
if(isset($ausgabe))
{
echo $ausgabe;
}
?>
Weder der erste, noch der zweite Fall trifft zu. Deshalb würde ich hier erwarten, dass die if-Bedingung nicht greift, weil $ausgabe nicht existiert.
Kann mir bitte wer erklären, wieso dem nicht so ist? Wieso existiert $ausgabe und wieso mit dem Wert 'foo', obwohl keiner der beiden switch-Fälle zutrifft?
Mit lieben Grüßen
Melvin Cowznofski
Moin,
<?php
$var = 0;
switch($var)
{
case 'foo': $ausgabe = 'foo'; break;
case 'bar': $ausgabe = 'bar';
}
if(isset($ausgabe))
{
echo $ausgabe;
}
?>
>
> Weder der erste, noch der zweite Fall trifft zu. Deshalb würde ich hier erwarten, dass die if-Bedingung nicht greift, weil $ausgabe nicht existiert.
beachte den Hinweis auf der Handbuchseite, die du verlinkst:
"Beachten Sie auch, dass switch/case typschwache Vergleiche durchführt."
Das bedeutet, dass PHP vor dem Vergleichen die Typen der Operanden einander angleicht. Der Operand von switch() ist in deinem Beispiel numerisch, also werden auch die einzelnen Abfragewerte in eine Zahl konvertiert. Dann wird 'foo' zu 0, und der Vergleich ist erfüllt.
Anders als bei einem Vergleich zweier Werte kann man AFAIK bei witch() keinen typsicheren Vergleich erzwingen. Also muss man als Programmierer aufpassen, dass die Typen der verwendeten Ausdrücke zueinander passen.
So long,
Martin
--
Soso, der Klügere gibt nach.
Aber warum sollen sich immer nur die Dummen durchsetzen? .oO(?)
Selfcode: fo:) ch:{ rl:| br:< n4:( ie:| mo:| va:) de:] zu:) fl:{ ss:) ls:µ js:(
Anders als bei einem Vergleich zweier Werte kann man AFAIK bei witch() keinen typsicheren
^^^^^ - hexerei - das alles
Vergleich erzwingen. Also muss man als Programmierer aufpassen, dass die Typen der verwendeten Ausdrücke zueinander passen.
Rainer --
Hallo,
Anders als bei einem Vergleich zweier Werte kann man AFAIK bei witch() keinen typsicheren
^^^^^ - hexerei - das alles
hab ich das wirklich geschrieben? - Tatsächlich ...
Naja, ist doch auch wahr! Ist doch wirklich alles Hexerei, Homöopathie und Alchimie!
Ciao,
Martin
@@Der Martin:
nuqneH
Naja, ist doch auch wahr! Ist doch wirklich alles Hexerei, Homöopathie und Alchimie!
Waldorfschule, hä?
Qapla'
Weil php recht hat :D.
In $var steht 0. "foo" == 0. Ergo ist $var == "foo". Demnach stimmt die erste Bedingung.
Die erste Bedingung würde nicht mehr stimmen, wenn du nach genau dem selben suchst also $var === "foo".
Das ist übrigens auch ein Grund wieso ich mich vor Jahren von switch verabschiedet habe und lieber else if benutze. Vor allem kann man bei else if das dumme break nicht vergessen, dass sind Fehler da kann man sich dumm und dämlich suchen.
Gruß
T-Rex == 1
T-Rex == 1
T-Rex++
scnr
Tach!
T-Rex == 1
Du schwindelst! Du bist genauso eine 0 wie alle anderen - außer 1UnitedPower.
dedlfix.
Tach!
"Erst wenn eine case Anweisung gefunden wird die dem Wert des an switch übergebenen Ausdrucks entspricht beginnt PHP tatsächlich die folgenden Anweisungen auszuführen." [...]
Dann verstehe ich nicht, wieso folgender Code zur Ausgabe von "foo" führt:
Siehe PHP type comparison tables oder in Prosa bei den Typen.
dedlfix.
Hallo dedlfix, T-Rex und Der Martin!
Bei einem Vergleich B zu A wird also der Variablentyp von B an den Variablentyp A angepasst. Das ist nachvollziehbar, daran hatte ich gar nicht gedacht.
In meinem Fall wird also der String "foo" in einen Integerwert umgewandelt, was laut php zum Wert 0 führt. Somit ergibt sich der Treffer. Sobald ich aus dem $var = 0
ein $var = 1
mache, entsteht kein $ausgabe
und es kommt somit zu keiner Ausgabe, weil 0 nicht gleich 1 ist.
Ich denke den Herren für die schnelle Antwort!
Mit lieben Grüßen
Melvin Cowznofski