En este momento se están evaluando y discutiendo todas las posibles características que se agregaran en PHP 8 (a cada una de estas evaluaciones, discusiones y aceptación/rechazo de características, se las llama RFC). Esta nueva versión de PHP se espera para fines de este año. Y en estos días se acaba de aprobar un RFC para incluir la expresión match en PHP 8.
¿Y qué es esto de la expresión Match y qué tiene de bueno? Bueno, es lo que veremos en este artículo.
La expresión Match en PHP 8
Hoy nos enteramos que se acepto el RFC para dar paso a la expresión Match en la próxima versión de PHP (puedes ver el RFC en https://wiki.php.net/rfc/match_expression_v2). Y esto nos entusiasma mucho ya que es una característica sumamente poderosa y con un gran potencial para el futuro de PHP.
La expresión Match no es algo nuevo. Existe desde hace rato en muchos lenguajes, tanto en los orientados a objetos como en los lenguajes funcionales, y es una pieza fundamental en estos últimos.
¿Qué es la expresión match y para que sirve?
A simple vista, podemos ver que la expresión match
tiene un funcionamiento parecido a la sentencia switch
.
Y acá el mismo ejemplo pero implementando la expresión match
:
Como ven ambas implementaciones son bastante similares pero, cuando utilizamos la expresión match, notamos varios beneficios:
- El código es más fácil de leer.
- La intención del código es más directa.
- No son necesarias las palabras claves
break
ycase
. - Y más mejoras que las pueden ver en su RFC.
Y hasta acá es donde llegara el poder de match
en PHP 8.
Te estarás preguntando «¿entonces es una mejor forma de escribir el switch?» Y la respuesta es si. Pero esto recién comienza. La expresión match es el principio de algo mas poderoso que se podría hacer en las próximas versiones de PHP.
Veamos algunas cosas que se podrían venir gracias a la expresión match.
El verdadero poder de Match: Pattern Matching
Los lenguajes que ya implementan la expresión match (como son los lenguajes de programación funcional) utilizan una técnica llamada Pattern Matching que consiste en evaluar un valor contra un patrón o una estructura.
Veamos varios ejemplos de lo que podríamos hacer con match y Pattern Matching. Para esto voy a utilizar cosas de Scala que todavía no existen en PHP.
Podríamos hacer algo como esto:
Lo que definimos en la parte de la izquierda de match no son valores, si no que son patrones. Y según que patrón coincida con $arreglo
, devolverá un valor.
Expliquemos con detalle que estamos diciendo en este match:
- Si viene un arreglo con únicamente una posición y en esa posición hay una
'a'
, entonces retorna el valor'1'
. - Si viene un arreglo que tiene dos elementos, donde no me importa lo que viene en el primer elemento (eso significa el
_
), y el segundo elemento es una'b'
, entonces retorna'2'
. - Y si el arreglo no coincide con ningún patrón de los anteriores, entonces retorna el texto
'cualquier cosa'
.
Apa! Ya no es tan parecido a un switch
no? 😏 Obviamente, todavía no tenemos el operador _
en PHP, es una de las cosas que se podrían agregar para darle más poder a la expresión match.
Otra cosa que podríamos hacer es match con wildcard:
Acá agregamos un asterisco al guion bajo que significaría «varios elementos más». Entonces, en este ejemplo se imprimiría la tercera opción ya que las dos primeras opciones esperan, si o si, que el arreglo tenga uno o dos elementos, únicamente.
Veamos algunas cosas más que se podrían hacer con match y Pattern Matching en PHP.
Constructor matching
Con match y Pattern Matching podríamos hacer Constructor Matching, que consiste en utilizar el operador «no me importa lo que venga» o mejor dicho, el guion bajo 😜, para armar patrones de coincidencias en clases. Por ejemplo:
En este ejemplo, sé imprimirá "tengo 18 años"
porque el primer patrón dice que debe ser un objeto de la clase User
, que tenga de nombre Juan
y edad igual a 21
.
Pero la instancia que definimos tiene de nombre Juan
y la edad es 18
. Por lo tanto, $user
«matchea» con el segundo patrón que «no le importa» el nombre.
Name Binding
También Pattern Matching nos permitiría hacer algo que se llama Name Binding y consiste en verificar si un objeto tiene ciertas propiedades o no:
En este caso se imprimiría el texto "tengo nombre y edad"
ya que construimos nuestro objeto con un nombre y una edad, justamente. Si nuestro objeto solo tendría edad, sé hubiera imprimido "solo tengo edad"
.
Y hasta podríamos utilizar dichas propiedades de la siguiente forma:
Y esto también abriría las puertas a otra cosa muy poderosa llamada Extractor Patterns 😱, y más y más cosas. Pero bueno, eso ya sé los dejo a ustedes para que lo investiguen, si es que les interesa.
Puede que ahora no veas el valor de estas cosas porque tal vez estas acostumbrado al PHP actual. Pero, que se comiencen a implementar características de lenguajes funcionales como Haskell, Scala, Erlang en PHP, es un gran salto para el lenguaje.
Conclusión
Si bien muchas de las cosas que puse en este artículo no se van a poder hacer con la expresión match
que tendrá PHP 8, no cabe duda que es la punta del iceberg de todo lo que se viene en PHP.
Ah! y en el RFC se menciona que ya se esta analizando la integración de Pattern Matching en próximas versiones. Así que a disfrutar de la época que se viene de PHP 🚀.
Espero que te haya gustado el artículo y que lo compartas si así fue 😃. Nos vemos en la próxima.
Estará increíble si logra parecerse a Scala o resulta algo mejor 😀
Muy bue post! No dejes de publicar, sos uno de los mejores en tips de laravel español!
Muchas gracias Esteban!