PHP 8 (imagen destacada)

Tiro monedas al aire, pero hasta ahora nunca las pude agarrar.

El 6 de agosto de 2020 salió la versión Beta 1 de PHP 8 y estoy probando de a poco los nuevos features que se vienen. La versión 8 estable se encuentra previsto ser lanzado en diciembre de 2020.

Trae muchas novedades interesantes para los desarrolladores. Una de ellas es el match expression. Información oficial click aquí.

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 un poco
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.

Vean el RFC que habla del match expression haciendo click aquí.


Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *