switch

Från Wiki.linux.se
Version från den 18 augusti 2024 kl. 07.20 av Admin (diskussion | bidrag) (→‎Exempel #1 switch-struktur)
(skillnad) ← Äldre version | Nuvarande version (skillnad) | Nyare version → (skillnad)
Hoppa till navigering Hoppa till sök

switch

(PHP 4, PHP 5, PHP 7, PHP 8)

`switch`-uttalandet liknar en serie `IF`-uttalanden på samma uttryck. Ofta kan du vilja jämföra samma variabel (eller uttryck) med många olika värden och utföra olika kodstycken beroende på vilket värde den är lika med. Det är precis vad `switch`-uttalandet är till för.

Not

Notera att till skillnad från vissa andra språk gäller `continue`-uttalandet för `switch` och beter sig liknande `break`. Om du har en `switch` inne i en loop och önskar fortsätta till nästa iteration av den yttre loopen, använd `continue 2`.

Notera att `switch`/`case` gör lösa jämförelser.

I följande exempel är varje kodblock ekvivalent. Ett använder en serie `if` och `elseif`-uttalanden, och det andra ett `switch`-uttalande. I varje fall är utmatningen den samma.

Exempel #1 switch-struktur

<?php
// Detta switch-uttalande:

switch ($i) {
    case 0:
        echo "i är lika med 0";
        break;
    case 1:
        echo "i är lika med 1";
        break;
    case 2:
        echo "i är lika med 2";
        break;
}

// Är ekvivalent med:

if ($i == 0) {
    echo "i är lika med 0";
} elseif ($i == 1) {
    echo "i är lika med 1";
} elseif ($i == 2) {
    echo "i är lika med 2";
}
?>

Det är viktigt att förstå hur `switch`-uttalandet utförs för att undvika misstag. `switch`-uttalandet exekveras rad för rad (faktiskt, uttalande för uttalande). I början utförs ingen kod. Endast när ett `case`-uttalande hittas vars uttryck utvärderas till ett värde som matchar värdet av `switch`-uttrycket börjar PHP att exekvera uttalandena. PHP fortsätter att exekvera uttalandena till slutet av `switch`-blocket, eller första gången det ser ett `break`-uttalande. Om du inte skriver ett `break`-uttalande vid slutet av en `case`-lista, kommer PHP att fortsätta att exekvera uttalandena för nästa `case`. Till exempel:

<?php
switch ($i) {
    case 0:
        echo "i är lika med 0";
    case 1:
        echo "i är lika med 1";
    case 2:
        echo "i är lika med 2";
}
?>

Här, om $i är lika med 0, skulle PHP exekvera alla `echo`-uttalandena! Om $i är lika med 1, skulle PHP exekvera de två sista `echo`-uttalandena. Du skulle få det förväntade beteendet ('i är lika med 2' skulle visas) endast om $i är lika med 2. Så det är viktigt att inte glömma `break`-uttalanden (även om du kanske vill undvika att tillhandahålla dem med flit under vissa omständigheter).

I ett `switch`-uttalande utvärderas villkoret endast en gång och resultatet jämförs med varje `case`-uttalande. I ett `elseif`-uttalande utvärderas villkoret igen. Om ditt villkor är mer komplicerat än en enkel jämförelse och/eller är i en snäv slinga, kan en `switch` vara snabbare.

Uttalandelisten för ett `case` kan också vara tom, vilket helt enkelt överför kontrollen till uttalandelisten för nästa `case`.

<?php
switch ($i) {
    case 0:
    case 1:
    case 2:
        echo "i är mindre än 3 men inte negativ";
        break;
    case 3:
        echo "i är 3";
}
?>

Ett speciellt fall är `default`-fallet. Detta fall matchar något som inte matchades av de andra fallen. Till exempel:

<?php
switch ($i) {
    case 0:
        echo "i är lika med 0";
        break;
    case 1:
        echo "i är lika med 1";
        break;
    case 2:
        echo "i är lika med 2";
        break;
    default:
       echo "i är inte lika med 0, 1 eller 2";
}
?>

Not: Flera `default`-fall kommer att orsaka ett E_COMPILE_ERROR-fel.

Not: Tekniskt sett kan `default`-fallet listas i vilken ordning som helst. Det kommer endast att användas om inget annat fall matchar. Dock är det av konvention bäst att placera det sist som den sista grenen.

Om inget `case`-gren matchar, och det inte finns någon `default`-gren, kommer ingen kod att exekveras, precis som om inget `if`-uttalande var sant.

Ett `case`-värde kan ges som ett uttryck. Dock kommer det uttrycket att utvärderas för sig självt och sedan jämföras löst med `switch`-värdet. Det innebär att det inte kan användas för komplexa utvärderingar av `switch`-värdet. Till exempel:

<?php
$target = 1;
$start = 3;

switch ($target) {
    case $start - 1:
        print "A";
        break;
    case $start - 2:
        print "B";
        break;
    case $start - 3:
        print "C";
        break;
    case $start - 4:
        print "D";
        break;
}

// Skriver ut "B"
?>

För mer komplexa jämförelser kan värdet true användas som `switch`-värde. Alternativt, `if-else`-block istället för `switch`.

<?php
$offset = 1;
$start = 3;

switch (true) {
    case $start - $offset === 1:
        print "A";
        break;
    case $start - $offset === 2:
        print "B";
        break;
    case $start - $offset === 3:
        print "C";
        break;
    case $start - $offset === 4:
        print "D";
        break;
}

// Skriver ut "B"
?>

Den alternativa syntaxen för kontrollstrukturer stöds med `switch`. För mer information, se Alternativ syntax för kontrollstrukturer.

<?php
switch ($i):
    case 0:
        echo "i är lika med 0";
        break;
    case 1:
        echo "i är lika med 1";
        break;
    case 2:
        echo "i är lika med 2";
        break;
    default:
        echo "i är inte lika med 0, 1 eller 2";
endswitch;
?>

Det är möjligt att använda ett semikolon istället för ett kolon efter ett `case` som:

<?php
switch($beer)
{
    case 'tuborg';
    case 'carlsberg';
    case 'stella';
    case 'heineken';
        echo 'Good choice';
        break;
    default;
        echo 'Please make a new selection...';
        break;
}
?>

Se också

Sidslut

Orginalhemsidan på Engelska : https://www.php.net/manual/en/control-structures.switch.php
PHP
Språkreferens
Språkreferens#Kontrollstrukturer