Match expression

De Wiki Proyectos Beta
Revisión del 06:32 18 ago 2022 de Josego (discusión | contribs.) (→‎Match múltiple)
(difs.) ← Revisión anterior | Revisión actual (difs.) | Revisión siguiente → (difs.)
Ir a la navegación Ir a la búsqueda

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.