(PHP 8)
La valutazione dei rami dell'espressione match
basata su un
controllo di identità di un valore.
Analogamente a un'istruzione switch
, un'
espressione match
ha un'espressione soggetto che viene
confrontata con più alternative. A differenza di switch
,
restituirà un valore molto simile alle espressioni ternarie.
A differenza di switch
, il confronto è un controllo di identità
(===
) piuttosto che un controllo di uguaglianza debole (==
).
Le espressioni di corrispondenza sono disponibili a partire da PHP 8.0.0.
Example #1 Structure of a match
expression
<?php
$return_value = match (subject_expression) {
single_conditional_expression => return_expression,
conditional_expression1, conditional_expression2 => return_expression,
};
?>
Nota: Non è necessario utilizzare il risultato di un'espressione
match
.
Nota: Un'espressione
match
deve essere terminata da un punto e virgola;
.
L'espressione match
è simile a un'
istruzione switch
ma presenta alcune differenze fondamentali:
match
confronta i valori rigorosamente (===
) invece
che vagamente come fa l'istruzione switch.
match
restituisce un valore.
match
non ricadono in casi successivi come
fanno le istruzioni switch
.
match
deve essere esaustiva.
Come le istruzioni switch
, le espressioni
match
vengono eseguite braccio di confronto per braccio di confronto.
All'inizio non viene eseguito alcun codice.
Le espressioni condizionali vengono valutate solo se tutte le espressioni condizionali
precedenti non sono riuscite a corrispondere all'espressione del soggetto.
Verrà valutata solo l'espressione di ritorno corrispondente all'espressione
condizionale corrispondente.
Per esempio:
<?php
$result = match ($x) {
foo() => ...,
$this->bar() => ..., // bar() non viene chiamata se foo() === $x
$this->baz => beep(), // beep() non è chiamata a meno che $x === $this->baz
// etc.
};
?>
I bracci delle espressioni match
possono contenere più espressioni
separate da una virgola. Questo è un OR logico, ed è una scorciatoia per più
bracci di corrispondenza con lo stesso lato destro.
<?php
$result = match ($x) {
// Questo braccio di corrispondenza:
$a, $b, $c => 5,
// È equivalente a questi tre bracci di corrispondenza:
$a => 5,
$b => 5,
$c => 5,
};
?>
Un caso speciale è il pattern default
.
Questo modello corrisponde a tutto ciò che non era stato precedentemente trovato.
Per esempio:
<?php
$expressionResult = match ($condition) {
1, 2 => foo(),
3, 4 => bar(),
default => baz(),
};
?>
Nota: Più pattern predefiniti solleveranno un errore
E_FATAL_ERROR
.
Un'espressione match
deve essere esaustiva. Se l'
espressione del soggetto non è gestita da alcun braccio di corrispondenza, viene
lanciato un UnhandledMatchError.
Example #2 Esempio di un'espressione di corrispondenza non gestita
<?php
$condition = 5;
try {
match ($condition) {
1, 2 => foo(),
3, 4 => bar(),
};
} catch (\UnhandledMatchError $e) {
var_dump($e);
}
?>
Il precedente esempio visualizzerà:
object(UnhandledMatchError)#1 (7) { ["message":protected]=> string(33) "Unhandled match value of type int" ["string":"Error":private]=> string(0) "" ["code":protected]=> int(0) ["file":protected]=> string(9) "/in/ICgGK" ["line":protected]=> int(6) ["trace":"Error":private]=> array(0) { } ["previous":"Error":private]=> NULL }
È possibile utilizzare un'espressione match
per gestire
casi condizionali non di identità utilizzando true
come espressione
del soggetto.
Example #3 Utilizzo di espressioni di corrispondenza generalizzate per ramificare su intervalli interi
<?php
$age = 23;
$result = match (true) {
$age >= 65 => 'senior',
$age >= 25 => 'adult',
$age >= 18 => 'young adult',
default => 'kid',
};
var_dump($result);
?>
Il precedente esempio visualizzerà:
string(11) "young adult"
Example #4 Utilizzo di espressioni di corrispondenza generalizzate per ramificare sul contenuto della stringa
<?php
$text = 'Bienvenue chez nous';
$result = match (true) {
str_contains($text, 'Welcome') || str_contains($text, 'Hello') => 'en',
str_contains($text, 'Bienvenue') || str_contains($text, 'Bonjour') => 'fr',
// ...
};
var_dump($result);
?>
Il precedente esempio visualizzerà:
string(2) "fr"