Menu

Espressione match in PHP: match vs switch, match(true)

match ($x) { 1, 2 => 'low', default => 'other' } confronta un valore con il === stretto, restituisce il risultato del primo ramo che corrisponde e lancia un UnhandledMatchError quando nulla corrisponde. Copre match vs switch, match(true) e match con gli enum.

Questa pagina include editor eseguibili: modifica, esegui e vedi subito l'output.

match ($value) { ... } confronta un valore con un elenco di rami usando il === stretto e restituisce il risultato del primo ramo che corrisponde. Più valori possono condividere un ramo, default raccoglie il resto, e se nulla corrisponde PHP lancia un UnhandledMatchError.

Nota il punto e virgola dopo la graffa di chiusura: match è un'espressione, come 1 + 2, quindi il tutto è un'unica istruzione di assegnazione. Ogni ramo è valori => risultato, separato da virgole, ed è consentita una virgola finale dopo l'ultimo ramo.

Più valori in un ramo

Elenca i valori separati da virgole. Il ramo corrisponde se il soggetto è identico (===) a uno qualsiasi di essi.

Restituire match direttamente da una funzione, come qui, è il modo più comune di usarlo.

match vs switch

La stessa associazione scritta nei due modi, con un input che mostra la differenza più grande: il confronto. switch usa ==, quindi la stringa "1" corrisponde a case 1. match usa ===, quindi no.

matchswitch
Confrontostretto ===debole ==
Risultatorestituisce un valoreistruzione, non restituisce nulla
Fallthroughmaisì, fino a break
Più valori1, 2 =>case 1: case 2: impilati
Nessuna corrispondenzalancia UnhandledMatchErrornon fa nulla
Corpo di un ramoun'espressionequalsiasi numero di istruzioni

Usa match quando trasformi un valore in un altro. Tieni switch quando un ramo richiede più istruzioni o quando il fallthrough è lo scopo; la pagina su switch mostra entrambi i casi.

UnhandledMatchError: quando nessun ramo corrisponde

Senza un ramo default, un valore che non corrisponde a nulla è un errore, non un null silenzioso. È una funzionalità: un nuovo codice di stato o un errore di battitura fallisce in modo evidente invece di passare inosservato.

PHP si ferma con PHP Fatal error: Uncaught UnhandledMatchError: Unhandled match case of type string. Una configurazione di sviluppo (con zend.exception_ignore_args disattivato) indica invece il valore: Unhandled match case 'XL'. Risolvi aggiungendo default => 'other', oppure catturando l'errore dove un valore sconosciuto è previsto:

match(true) per intervalli e condizioni

match confronta il soggetto con ogni ramo, quindi se il soggetto è true, ogni ramo può essere una condizione. Vince la prima condizione che vale esattamente true.

Due dettagli in quel blocco. Da PHP 8 throw è un'espressione, quindi può essere il risultato di un ramo. E dato che il confronto è stretto, ogni condizione deve restituire un vero booleano: un ramo come $name => ... non corrisponde mai a true anche quando $name è una stringa non vuota. Viene valutato solo il ramo che corrisponde, quindi il throw viene eseguito solo per un'età negativa.

match con gli enum

match e gli enum vanno d'accordo: dentro un metodo di un enum, match ($this) associa ogni case a un valore. Vedi gli enum in PHP per gli enum stessi.

Qui niente default, di proposito. Se in futuro qualcuno aggiunge un quinto case, chiamare color() su di esso lancia un errore invece di restituire un colore sbagliato.

Più istruzioni in un ramo

Un ramo contiene un'espressione, quindi 'save' => { ...; ... } non è PHP valido. Sposta il lavoro in una funzione e chiamala dal ramo. Le funzioni dei rami che non corrispondono non vengono mai chiamate.

Cambia $format in 'json' o 'xml' ed eseguilo di nuovo.

Domande frequenti

Qual è la differenza tra match e switch in PHP?

match confronta con il === stretto, restituisce un valore, non prosegue mai nel ramo successivo, accetta più valori separati da virgola per ramo e lancia un UnhandledMatchError quando nessun ramo corrisponde. switch confronta con il == debole, è un'istruzione che non restituisce nulla, prosegue nei case successivi senza break e non fa nulla in silenzio quando nessun case corrisponde.

Cosa succede quando nessun ramo corrisponde in un'espressione match PHP?

PHP lancia un UnhandledMatchError. Aggiungi un ramo default => ... per gestire ogni altro valore, oppure cattura l'errore con try { ... } catch (\UnhandledMatchError $e) { ... }.

Come uso match con condizioni come maggiore di in PHP?

Fai il match con true: match (true) { $age < 13 => 'child', $age < 18 => 'teen', default => 'adult' }. Ogni ramo è una condizione, e vince la prima che è esattamente true.

Un ramo di match può eseguire più istruzioni in PHP?

No, ogni ramo è una singola espressione. Metti le istruzioni in una funzione o in un metodo e chiamala dal ramo, per esempio 'export' => exportCsv($rows).

Quale versione di PHP ha aggiunto match?

PHP 8.0. Su PHP 7 la stessa logica richiede un'istruzione switch o una ricerca in un array come $labels[$status] ?? 'Unknown'.

Illustrazione dei linguaggi di programmazione di Coddy

Impara a programmare con Coddy

INIZIA