Wann switch ohne break oder switch ( true ) verwenden
Veröffentlicht: – 1 Kommentar
switch-Anweisungen sind oftmals in PHP-Code unterrepräsentiert. Doch das muss nicht sein, haben sie doch ein paar coole Funktionen, die das Leben einfacher macht.
Was ist die switch-Anweisung?
Eine switch-Anweisung ist ähnlich wie mehrere if-Anweisungen, prüft aber immer auf dieselbe Bedingung. Wenn du auf dieselbe Bedingung mehrmals prüfen musst, sieht switch oftmals sauberer und einfacher verständlich aus, als wenn dafür mehrere if-Anweisungen verwendet werden, wie das folgende Beispiel zeigt:
if ( $type == 'foo' ) {
$object = new Foo();
}
else if ( $type == 'bar' ) {
$object = new Bar();
}
else if ( $type == 'foobar' ) {
$object = new Foobar();
}
else if ( $type == 'baz' ) {
$object = new Baz();
}
else {
$object = null;
}Code-Sprache: PHP (php)
Als switch-Anweisung sieht es so aus:
switch ( $type ) {
case 'foo':
$object = new Foo();
break;
case 'bar':
$object = new Bar();
break;
case 'foobar':
$object = new Foobar();
break;
case 'baz':
$object = new Baz();
break;
default:
$object = null;
break;
}Code-Sprache: PHP (php)
Normalerweise würde ich einen strikten Typenvergleich in meinen if-Anweisungen verwenden, aber da switch diese nicht verwendet, sind nur diese beiden Code-Teile genau so identisch.
Eine spezielle Funktion der switch-Anweisung ist dass es mit einem Standard über default arbeiten kann, wenn kein anderer case zutrifft. Das ist ähnlich wie die else-Anweisung in einer if-Abfrage.
Du kannst auch mehrere case-Anweisungen zusammenfassen, um dann denselben Code auszuführen, um ein logisches ODER zu verwenden:
switch ( $type ) {
case 'foo':
case 'bar':
case 'foobar':
$object = new Foobar();
break;
case 'baz':
$object = new Baz();
break;
default:
$object = null;
break;
}Code-Sprache: PHP (php)
Dies erstellt immer eine neue Instanz für Foobar, wenn $type entweder foo, bar oder foobar ist.
Wann braucht man break nicht?
Die break-Anweisung stoppt den Code an dieser Stelle innerhalb eines case und fährt mit dem Code nach der switch-Anweisung fort. Im obigen Beispiel bedeutet dies, dass $object immer nur einmal zugewiesen wird, da die switch-Ausführung danach gestoppt wird und mit dem nachfolgenden Code fortgefahren wird. Du kannst jedoch auch jederzeit auf break verzichten, was bedeutet, dass der Code weiter ausgeführt wird, aber nicht mit anderen case-Anweisungen verglichen wird. Ich verwende es im Migrationscode von Embed Privacy, der wie folgt aussieht:
switch ( $version ) {
case '1.2.0':
$this->migrate_1_2_1();
case '1.2.1':
$this->migrate_1_2_2();
case '1.2.2':
$this->migrate_1_3_0();
case '1.3.0':
$this->migrate_1_4_0();
case '1.4.0':
$this->migrate_1_4_7();
case '1.4.7':
$this->migrate_1_5_0();
case '1.5.0':
$this->migrate_1_6_0();
case '1.6.0':
$this->migrate_1_7_0();
case '1.7.0':
$this->migrate_1_7_3();
case '1.7.3':
$this->migrate_1_8_0();
case '1.8.0':
$this->migrate_1_10_5();
case '1.10.5':
$this->migrate_1_10_6();
case '1.10.6':
case '1.10.7':
$this->migrate_1_10_7();
case '1.10.9':
$this->migrate_1_11_0();
case $this->version:
// most recent version, do nothing
break;
default:
// run all migrations
$this->migrate_1_2_0();
break;
}Code-Sprache: PHP (php)
Wenn beispielsweise $version den Wert 1.7.0 besitzt, lass ich alle Migrationen von diesem Punkt an laufen:
$this->migrate_1_7_3();$this->migrate_1_8_0();$this->migrate_1_10_5();$this->migrate_1_10_6();$this->migrate_1_10_7();$this->migrate_1_11_0();
Es ignoriert spätere case-Anweisungen vollständig und hält erst beim ersten break an. Auf diesem Weg kann ich sicherstellen, dass selbst wenn die aktuell verwendete Version eine ältere ist als die nächst ältere von der aktuellen Version, alle Migrationen von diesem Punkt an durchlaufen.
Wann kann ich switch( true ) verwenden?
Die switch ( true )-Anweisung vergleicht jeden case mit true. Das kann verwendet werden, um komplexere Bedingungen zu vergleichen:
switch ( true ) {
case $type === 'foo':
$object = new Foo();
break;
case $version === '1.2.0':
$object = new Bar();
break;
case $type === 'foobar' && $version === '1.3.0':
$object = new Foobar();
break;
}Code-Sprache: PHP (php)
Auf diesem Weg kannst du praktisch alles innerhalb einer switch-Anweisung vergleichen und auch strikte Typenvergleiche verwenden.
Weitere Beispiele
Weitere Beispiele findest du im PHP Manual und insbesondere dort in den Kommentaren.
Ich bin ein großer Freund der switch-Anweisung.
switch ( true ) kannte ich noch nicht. Finde ich aber auch etwas merkwürdig.
Es grüßt
derRALF