array ( 0 => 'index.php', 1 => 'PHP Manual', ), 'head' => array ( 0 => 'UTF-8', 1 => 'es', ), 'this' => array ( 0 => 'control-structures.match.php', 1 => 'match', ), 'up' => array ( 0 => 'language.control-structures.php', 1 => 'Estructuras de Control', ), 'prev' => array ( 0 => 'control-structures.switch.php', 1 => 'switch', ), 'next' => array ( 0 => 'control-structures.declare.php', 1 => 'declare', ), 'alternatives' => array ( ), 'source' => array ( 'lang' => 'es', 'path' => 'language/control-structures/match.xml', ), ); $setup["toc"] = $TOC; $setup["toc_deprecated"] = $TOC_DEPRECATED; $setup["parents"] = $PARENTS; manual_setup($setup); ?>
(PHP 8)
La expresión match
ramifica la evaluación basada en una
comprobación de identidad de un valor.
De forma similar a una sentencia switch
, una
expresión match
tiene una expresión de sujeto que se
compara con múltiples alternativas. A diferencia de switch
,
se evaluará a un valor muy parecido al de las expresiones ternarias.
A diferencia de switch
, la comparación es una comprobación de identidad
(===
) en lugar de una comprobación de igualdad débil (==
).
Las expresiones match están disponibles a partir de PHP 8.0.0.
Ejemplo #1 Estructura de una expresión match
<?php
$return_value = match (subject_expression) {
single_conditional_expression => return_expression,
conditional_expression1, conditional_expression2 => return_expression,
};
?>
Nota: El resultado de una expresión
match
no necesita ser utilizado.
Nota: Una expresión
match
debe terminar con un punto y coma;
.
La expresión match
es similar a una
sentencia switch
pero tiene algunas diferencias clave:
match
compara los valores estrictamente (===
) en lugar
de hacerlo de forma suelta como lo hace la sentencia switch.
match
retorna un valor.
Match
no pasan a casos posteriores
como lo hacen las sentencias switch
.
match
debe ser completa.
Como las expresiones switch
, las expresiones match
se ejecutan de brazo a brazo.
Al principio, no se ejecuta ningún código.
Las expresiones condicionales sólo se evalúan si todas las anteriores
no coinciden con la expresión del sujeto.
Sólo se evaluará la expresión de retorno correspondiente
a la expresión condicional que coincida.
Por ejemplo:
<?php
$result = match ($x) {
foo() => ...,
$this->bar() => ..., // bar() no se llama si foo() === $x
$this->baz => beep(), // beep() no se llama a menos que $x === $this->baz
// etc.
};
?>
Los brazos de la expresión match
pueden contener varias expresiones
separadas por una coma. Se trata de un OR lógico, y es una abreviatura de múltiples
brazos match con el mismo lado derecho.
<?php
$result = match ($x) {
// Este brazo match:
$a, $b, $c => 5,
// Es equivalente a estos tres:
$a => 5,
$b => 5,
$c => 5,
};
?>
Un caso especial es el patrón default
.
Este patrón permite hacer coincidir cualquier cosa que no se haya hecho coincidir previamente.
Por ejemplo:
<?php
$expressionResult = match ($condition) {
1, 2 => foo(),
3, 4 => bar(),
default => baz(),
};
?>
Nota: Múltiples patrones default lanzarán un error
E_FATAL_ERROR
.
Una expresión match
debe ser completa. Si la
expresión del sujeto no es manejada por ningún brazo match
se lanza un UnhandledMatchError.
Ejemplo #2 Ejemplo de una expresión match no controlada
<?php
$condition = 5;
try {
match ($condition) {
1, 2 => foo(),
3, 4 => bar(),
};
} catch (\UnhandledMatchError $e) {
var_dump($e);
}
?>
El resultado del ejemplo sería:
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 }
Es posible utilizar un expresión match
para manejar
casos de condicionales de no identidad usando true
como expresión
del sujeto.
Ejemplo #3 Uso de expresiones match generalizadas para ramificar en rangos de integers
<?php
$age = 23;
$result = match (true) {
$age >= 65 => 'senior',
$age >= 25 => 'adult',
$age >= 18 => 'young adult',
default => 'kid',
};
var_dump($result);
?>
El resultado del ejemplo sería:
string(11) "young adult"
Ejemplo #4 Uso de expresiones match generalizadas para ramificar el contenido de strings.
<?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);
?>
El resultado del ejemplo sería:
string(2) "fr"