Match expression
RFC EN
El match expression es una nueva expresión de coincidencia que es similar a switch, pero con una semántica más segura y la capacidad de devolver valores.
Antes de la versión 8 en PHP:
switch ($this->lexer->lookahead['type']) { case Lexer::T_SELECT: $statement = $this->SelectStatement(); break; case Lexer::T_UPDATE: $statement = $this->UpdateStatement(); break; case Lexer::T_DELETE: $statement = $this->DeleteStatement(); break; default: $this->syntaxError('SELECT, UPDATE or DELETE'); break; }
Versión PHP 8
$statement = match ($this->lexer->lookahead['type']) { Lexer::T_SELECT => $this->SelectStatement(), Lexer::T_UPDATE => $this->UpdateStatement(), Lexer::T_DELETE => $this->DeleteStatement(), default => $this->syntaxError('SELECT, UPDATE or DELETE'), };
Algunas diferencias con switch
Retorna un valor (return value)
Es muy común que el switch retorne un valor para utilizar después.
switch (1) { case 0: $result = 'Foo'; break; case 1: $result = 'Bar'; break; case 2: $result = 'Baz'; break; } echo $result; //> Bar
Es bastante fácil olvidar asignar un valor a la variable $result en uno de los case y poco intuitivo encontrar la variable $result declarado en un scope anidado más profundo. match es una expresión que evalúa el resultado. Esto elimina una gran cantidad de repetición y hace que sea imposible olvidar la asignación de un valor en la variable $result.
echo match (1) { 0 => 'Foo', 1 => 'Bar', 2 => 'Baz', }; //> Bar
Sin tipo de coerción (no type coercion)
La sentencia switch utiliza la comparación (==) evaluar en los case.
switch ('foo') { case 0: $result = "Oh no!\n"; break; case 'foo': $result = "This is what I expected\n"; break; } echo $result; //> Oh no!
La expresion switch utiliza la comparación (===) que evalua de forma estricta las opciones.
echo match ('foo') { 0 => "Oh no!\n", 'foo' => "This is what I expected\n", }; //> This is what I expected
Match múltiple
La expresión match no requiere de la utilización del break y se puede hacer match múltiple:
echo match ($x) { 1, 2 => 'Same for 1 and 2', 3, 4 => 'Same for 3 and 4',
};
Resumiendo
Match expression puede:
- Retornar valores.
- No requiere de una sentencia break.
- Se puede combinar condiciones.
- Utiliza comparaciones estrictas (===) evitando el type coersion.
- Match múltiple.