W3docs

switch

In PHP, la parola chiave "switch" valuta un valore ed esegue azioni diverse in base ad esso. È un'alternativa all'uso di più istruzioni "if".

L'istruzione switch in PHP

L'istruzione switch in PHP valuta un'espressione ed esegue il blocco di codice corrispondente al suo valore. È l'alternativa più leggibile a una lunga catena di istruzioni if / elseif / else quando si confronta la stessa variabile con molti valori possibili.

Questo capitolo tratta la sintassi, la fondamentale parola chiave break, il fall-through intenzionale, la sintassi alternativa endswitch e l'insidia del confronto non rigoroso che mette in difficoltà la maggior parte dei principianti.

Sintassi

La sintassi di base di un'istruzione switch in PHP è la seguente:

<?php
switch ($value) {
  case $value1:
    // Code block here
    break;
  case $value2:
    // Code block here
    break;
  default:
    // Code block here
}

PHP confronta $value con ogni case dall'alto verso il basso. La prima corrispondenza vince: il suo blocco viene eseguito e break esce dallo switch. Se nessun case corrisponde, viene eseguito il blocco default opzionale. default non deve necessariamente essere l'ultimo, ma posizionarlo alla fine è la convenzione che i lettori si aspettano.

Perché break è importante

L'istruzione break interrompe l'esecuzione ed esce dal blocco switch. Senza di essa, PHP continua a eseguire il codice in tutti i case successivi finché non incontra un break o la fine del blocco — un comportamento chiamato fall-through. Questo è il bug più comune nelle istruzioni switch:

<?php
$role = "editor";

switch ($role) {
  case "admin":
    echo "Full access. ";
    // no break — execution "falls through" to the next case
  case "editor":
    echo "Can edit content. ";
    break;
  case "viewer":
    echo "Read only.";
    break;
}
// Output: Can edit content.

Qui editor corrisponde, stampa il suo messaggio e il break esce in modo pulito. Dimenticare il break dopo admin permetterebbe a un amministratore di eseguire anche il codice di editor. Vedere break per la parola chiave completa.

Fall-through intenzionale

Il fall-through non è sempre un errore. Impilare etichette case vuote permette a più valori di condividere un unico blocco — un modo elegante per raggruppare condizioni:

<?php
$month = 2;

switch ($month) {
  case 12:
  case 1:
  case 2:
    echo "Winter";
    break;
  case 3:
  case 4:
  case 5:
    echo "Spring";
    break;
  default:
    echo "Another season";
}
// Output: Winter

Esempi

Vediamo alcuni esempi pratici di utilizzo di switch:

<?php

// Example 1
$dayOfWeek = "Wednesday";

switch ($dayOfWeek) {
  case "Monday":
  case "Tuesday":
  case "Wednesday":
  case "Thursday":
  case "Friday":
    echo "It's a weekday.";
    break;
  case "Saturday":
  case "Sunday":
    echo "It's a weekend.";
    break;
}

// Example 2
$grade = "B";

switch ($grade) {
  case "A":
    echo "Excellent!";
    break;
  case "B":
    echo "Good job!";
    break;
  case "C":
    echo "Could do better.";
    break;
  default:
    echo "Please enter a valid grade.";
}

Il primo esempio raggruppa i nomi dei giorni feriali con etichette case impilate per distinguere tra giorno feriale e fine settimana. Il secondo esempio associa un voto letterale a un messaggio di feedback, con default che gestisce qualsiasi valore non corrispondente.

L'insidia del confronto non rigoroso

Per impostazione predefinita, switch confronta con uguaglianza non rigorosa (==), quindi i valori vengono confrontati dopo la conversione di tipo — non con === rigoroso. Questo può produrre corrispondenze sorprendenti:

<?php
$value = "1";

switch ($value) {
  case 1:
    echo "Matched the integer 1!";
    break;
  default:
    echo "Matched default.";
}
// Output: Matched the integer 1!

La string "1" corrisponde all'intero case 1 perché == converte i tipi prima di confrontare. Quando hai bisogno di un controllo del tipo rigoroso, usa una catena di istruzioni if / elseif con ===, oppure usa l'espressione match (PHP 8+), che confronta in modo rigoroso e restituisce un valore:

<?php
$grade = "B";

$message = match ($grade) {
  "A" => "Excellent!",
  "B" => "Good job!",
  "C" => "Could do better.",
  default => "Please enter a valid grade.",
};

echo $message;
// Output: Good job!

match non ha fall-through e non richiede break, eliminando un'intera categoria di bug.

Sintassi alternativa endswitch

Quando si incorpora PHP nei template HTML, la forma con i due punti e endswitch può risultare più leggibile:

<?php switch ($status): ?>
  <?php case "active": ?>
    <span>Active</span>
    <?php break; ?>
  <?php default: ?>
    <span>Inactive</span>
<?php endswitch; ?>

Vantaggi

  • Leggibilità — uno switch è più facile da analizzare rispetto a molte istruzioni if quando si confronta la stessa variabile con diversi valori.
  • Valutazione singola — l'espressione dello switch viene valutata una sola volta, quindi confrontata con ogni case.

Capitoli correlati

Esercitazione

Pratica
Secondo il contenuto della pagina su w3docs.com, in quali circostanze si può usare un'istruzione 'switch' in PHP?
Secondo il contenuto della pagina su w3docs.com, in quali circostanze si può usare un'istruzione 'switch' in PHP?
Was this page helpful?