Las principales novedades de PHP 8
Descubre todas las novedades que traerá la versión 8 de PHP en Diciembre de 2020
El lanzamiento de la versión 8 de PHP está previsto para el día 3 Diciembre de 2020 y aunque todavía estamos pendientes de que se libere su versión alpha para comenzar a probarla (en teoría esto será el día 18 de junio), ya se conocen algunas de las principales novedades que incorporará y que hoy quiero comentaros en este artículo.
Recordad que al tratarse de una versión mayor los cambios que introducirá puede que sean incompatibles con versiones anteriores obteniendo a cambio mejoras tanto de rendimiento como características muy interesantes. Por tanto, mi consejo es que estéis al tanto de las noticias que van saliendo así como de la lista de “deprecations” de cara a que cuando se libere actualizar no sea ningún problema.
Y ahora sí, ¡comencemos con lo interesante!
Union Types
Una de las características más demandadas desde que comenzamos a poder “tipar” los argumentos de funciones y métodos era la posibilidad de especificar varios tipos para un argumento y el retorno de una función.
Los “union types” son una colección de dos o más tipos de modo que indiquemos que cualquiera de ellos es válido cuando especifiquemos el valor de ese argumento o el tipo de retorno de la función.

Podéis leer más sobre los Union Types en PHP 8 en su RFC.
Attributes
Los atributos o anotaciones nos permiten añadir meta datos a nuestras clases, algo que seguramente os resulte familiar si trabajáis con frameworks como Symfony o Laravel.
Según lo propuesto en la RFC, a partir de PHP 8 podremos especificar atributos / anotaciones sin tener que recurrir a bloques de comentarios.
Para ello, lo primero que haremos será crear un atributo como si de una clase se tratase y empleando el atributo <<PhpAttribute>>
para que pueda ser identificado como tal.

Hecho esto, bastará con que lo empleemos allá donde lo necesitemos, pudiendo especificar los argumentos que hayamos declarado en el constructor del atributo:

Apuesto a que no tardaremos mucho en ver estos atributos en Symfony para declarar las rutas o en Doctrine para realizar el mapeo de nuestras entidades. Como podéis ver, quedan muy limpios y evitan el problema de emplear comentarios que, en mi opinión, empeoran la legilibilidad del codigo.
Podéis leer más sobre los Attributes en PHP 8 en su RFC.
Constructor Property Promotion
PHP 8 también trae lo que se conocen como “azucarillos sintáticos” que nos permiten simplificar el código que escribimos por versiones más cortas.
Uno de estos nuevos “sintactic sugars” es el “Constructor Property Promotion” que nos permite pasar de construir nuestros DTO’s o “value objects” de esta forma:

A esta mucho más reducida:

Un gran cambio y que nos permite simplificar muchísimo la creación de este tipo de objetos además de poner de relieve el interés del equipo de PHP en crear un lenguaje agradable y moderno.
Podéis leer más sobre “Constructor Property Promotion” en su RFC.
Mixed Type
Seguro que alguna vez habéis tratado de tipar un argumento o el valor de retorno de una función mediante mixed
pensando que era un tipo válido y, sin embargo, habéis recibido un error al hacerlo. Por ejemplo:
- una función que devuelve
void
onull
. - un argumento que puede recibir valores de varios tipos.
Con PHP 8 ya podremos tipar mediante mixed
argumentos, propiedades y valores de retorno para representar varios de estos valores:
array
bool
callable
int
float
null
object
resource
string
Sí, como veis mixed
también incluye null
por lo que no será valido un “tipado” como el siguiente: ?mixed
.
Podéis leer más sobre “mixed typed” en su RFC.
::class
en objetos
Otro “sintactic sugar” que nos trae PHP8 es la posibilidad de emplear ::class
sobre objetos y no sólo sobre el FQDN de una clase, de modo que ya no sea necesario emplear la función get_class
:

Nuevas funciones para trabajar con strings
PHP 8 trae también una serie de nuevas funciones para simplificar la forma en que trabajamos con el tipo string
.
Seguramente la más interesante de ellas sea str_contains
, la cual ¡por fin! nos soluciona tener que emplear la función strpos
para comprobar si un string contiene a otro.
Es decir, se acabó hacer esto:

Ya que gracias a str_contains
quedará mucho más simplificado y legible:

Además de esta función, PHP 8 incorpora dos más:
str_starts_with
para comprobar si un string comienza con un determinado string.str_ends_with
para comprobar si un string termina con un determinado string.

Stringable
PHP 8 añade la interfaz Stringable
para que podamos tipar aquellos argumentos o valores de retorno que son o bien un string
o bien implementan el método __toString()
.
Además, a partir de ahora cualquier clase que declare el método __toString()
implementará automáticamente esta interfaz sin necesidad de que lo especifiquemos a mano.

Podéis leer más sobre “Stringable en su RFC.
Catch sin especificar la variable que recoge la excepción
Otra mejora que trae PHP 8 es la posibilidad de especificar bloques try / catch
sin que el catch
tenga que declarar la variable que recoge la excepción, ya que a veces no se emplea para nada, añadiendo ruido visual al código o incluso siendo señalado como warning por el editor:

Weak Maps
Finalmente, PHP 8 introduce los WeakMaps
, basados en las “Weak References” de PHP 7.4 sobre las cuales podéis leer en la propia documentación de PHP:
Los WeakMaps
nos permiten almacenar referencias a objetos pero sin impedir que estos sean eliminados por el “garbage collector”. Seguramente esto sea un añadido muy interesante para librerías encargadas de cachear objetos como por ejemplo hace Doctrine con las entidades que recupera y que, almacenándolas en WeakMaps
permitirían liberar memoria de forma más eficiente cuando esas entidades dejan de tener referencias en algún momento.
Un ejemplo de su uso lo podemos ver en la RFC de los WeakMap
:

Podéis leer más sobre los “Weak Maps” en su RFC.
Vídeo
Para complementar este artículo he grabado un vídeo donde podéis ver todas estas características funcionando en directo. ¡Espero que os guste!
Conclusiones
PHP 8 trae interesantes novedades tanto a nivel de funcionalidad como a nivel sintáctico. Esto en mi opinión lo lleva a un punto más de madurez demostrando que no se trata de un lenguaje “antiguo” ni mucho menos sino que cada vez cuenta con más y más posibilidades (creo que los “Attributes” por ejemplo hablan de la buena salud que tiene en este momento la evolución de PHP).
Las novedades que os he mostrado en este artículo son las que más me han llamado la atención. Sin embargo, se me quedan bastantes en el tintero, como por ejemplo el JIT compiler, al cual espero dedicar un artículo completo en el momento que haya los primeros benchmarks de la mejora que supone.
Apóyame en Patreon
Gracias a: Alex Fuentes y Jorge Hernández.
¿Quieres recibir más artículos como este?
Si te ha gustado este artículo te animo a que te suscribas a la newsletter que envío cada domingo con publicaciones similares a esta y más contenido recomendado: 👇👇👇