¿Cuáles son las novedades de PHP 8?

Te explicaré todo sobre PHP 8 en este artículo

¿Merece la pena cambiarse a PHP 8? Sí, sin duda. Acompáñame durante unos minutos y te verás como debes hacer el cambio.

Haz click aquí para contactarnos

A lo largo de este final de año 2020 o principios del 2021, PHP 8 se abrirá al mundo con un gran abanico de cambios y mejoras. Por ello, os traigoaquellas funcionalidades que más me han llamado la atención, teniendo en cuenta que aún algunas de ellas están pendientes de votación por parte del equipo de PHP, pero muchas otras ya han sido aceptadas y están siendo preparadas para su lanzamiento.

Desde aquí, trataré de dar una visión global de este cambio, describiré, analizaré y opinaré sobre los puntos positivos y negativos de cada nueva funcionalidad, para así tener una percepción inicial de lo que será PHP 8 y en que nos influirá como desarrolladores o programadores que utilizan este lenguaje.


JIT

JIT, acrónimo de Just in Time, es la novedad más esperada que introducirá PHP 8. ¿De que se trata JIT?

Según RFC , nos lo describe de la siguiente manera:

PHP JIT se implementa como una parte casi independiente de OPcache. Se puede habilitar / deshabilitar en tiempo de compilación de PHP y en tiempo de ejecución. Cuando está habilitado, el código nativo de los archivos PHP se almacena en una región adicional de la memoria compartida OPcache y op_array ? opcodes []. Los manejadores mantienen punteros a los puntos de entrada del código JIT-ed

En otras palabras, JIT es una técnica que compilará partes de código en tiempo de ejecución, de tal forma que la versión compilada podrá ser usada en lugar de la interpretada. Puedes pensarlo como una versión en cache del código interpretado, generada en tiempo de ejecución.

Esto lo hace buscando las partes del código más calientes, es decir, las que más veces se van a ejecutar a lo largo de la ejecución de tu programa, y son partes de tu código que se transformarán en código compilado.

Esta mejora se notará en proyectos de cálculos repetitivos, como códigos fractales o algebraicos. Por otra parte, como podrás entender, en un contexto de proyecto de Web-Request hay poco código caliente, por ello, a corto plazo no se espera una gran mejora en la performance de las aplicaciones web hechas con PHP.

Por contra, hay detractores de la implementación de JIT en PHP 8, ya que defienden que esta técnica añade complejidad de mantenimiento al lenguaje. Además, de que para desarrolladores de PHP, es decir, desarrolladores de código de alto nivel, tener que debuggar posibles errores que aparezcan en el código generado por JIT, que es código de bajo nivel, les será una tarea muy complicada, ya que no están acostumbrados a lenguajes tan cercanos al lenguaje de la máquina.


Declaración de atributos de una clase en el constructor

Con tal de eliminar redundancia y mejorar la ergonomía de las clases en PHP, se ha diseñado una nueva forma de declarar los atributos de una clase.

Hasta ahora la estructura de una clase con sus atributos era la siguiente:


Como vemos debemos repetir el mismo código tres veces, primero en la declaración de atributos, después en la definición de parámetros y por último en la asignación de atributos.

Esta redundancia de código viene eliminada en PHP 8 con la siguiente propuesta:


Como podemos observar todo se une en los parámetros del constructor, donde podremos definir el nivel de acceso, el tipado y el valor por defecto del atributo y PHP se encargará automáticamente de la asignación del valor del atributo.

Esto también aplica para las clases que extiendan a otras clases y tengan que pasar los atributos a la clase parent. En el siguiente ejemplo veremos una clase Teacher que extiende de la anterior clase Person y como conseguimos pasarle los atributos a la clase parent.


Como podemos observar, la clase Teacher tiene un nuevo atributo de tipo String, el cual declaramos, tipamos y asignamos en el constructor de la clase, por otro lado tenemos los atributos del parent, que se los pasamos al parent vía el cuerpo del constructor.

Esta nueva forma de diseño no está permitida ni para clases abstractas, ni para interfaces, las cuales al intentar utilizar este formato nos lanzarán una excepción de constructor.

Por otra parte, para marcar que un atributo puede ser nullable ya no lo podremos hacer implícitamente en el constructor como lo hacíamos hasta ahora. Para ello, deberemos marcar el tipo de este como nullable. En el siguiente ejemplo lo veremos:


Arrays con índice negativo

Hasta ahora cuando iniciábamos un array con índice negativo como primer elemento, PHP seguía la progresión desde el 0, sin tener en cuenta que valor negativo tenía el primer índice, es decir, si marcábamos como primera posición el índice -5, la segunda posición del array sería 0. A partir de PHP la progresión será consecutiva, por ejemplo, si marcamos como primer índice el -4 los siguientes serán -3, -2, -1, 0...


Union Types

En PHP 8 podremos ver la integración de la unión de tipos. Esto nos permitirá que en aquellos sitios donde debamos tipar podremos marcar multitud de tipos. En los siguientes ejemplos lo veremos más claro:


Como vemos, podemos marcar el atributo number como tipo int y float, y como consecuencia también podremos esperar un int y float en la definición del parámetro en una función y en la devolución de datos de una función. La unión de tipos lo podremos hacer con cualquier tipo soportado por PHP.


Throw como expression, no como statement

El concepto throw en PHP se trataba como un statement, como por ejemplo, function, public, class, etc. Lo que se pretende a partir de PHP 8 es la utilización de throw como una expresión. Con ello se quiere poder lograr utilizar throw en los mismos contextos que se puede utilizar una expresión. Como por ejemplo en arrow functions, operadores de null coalesce, ternarias y operadores elvis.


Coma en la cola de la lista de parámetros

Como bien sabréis, en los arrays de PHP se puede dejar una coma después del último elemento de la lista con tal de facilitar las cosas al próximo elemento entrante, esto en el caso de la lista de los parámetros no se puede hacer, ya que nos lanzaría un error. Pues a partir de PHP 8 ya se podrá dejar una coma después del último parámetro de la lista.



Como veis en la lista de parámetros de la función setWeight en el ejemplo de arriba, dejamos una coma tras el último elemento, en este caso el parámetro weight.


Permitir ::class en los objetos

A partir de PHP 8 tendremos a nuestra disposición una nueva forma de obtener el nombre del objeto al cual hace referencia una variable. Hasta ahora teníamos la función get_class($object), con PHP 8 los objetos integrarán la sintaxis de las clases para obtener el nombre, está es $object::class. Con el siguiente ejemplo lo podréis ver:


Nuevas funciones

str_contains
Hasta ahora los desarrolladores de PHP debíamos usar las funciones de strstr y strpos para encontrar una cadena de texto contenida en otra, lo cual era poco intuitivo y confuso para los programadores. Por ello, PHP 8 contará con la función str_contains, la cual devolverá un boolean dando true en el caso de que el primer parámetro de la función, siendo está un string, esté contenida en el segundo parámetro de la función, siendo está también un string.


Como podemos observar, en el primer ejemplo, la ejecución de str_contains nos devolverá true ya que el literal de “pepe” se encuentra en la cadena de texto de la variable names, en el segundo caso nos dará false ya que el literal “pepe” no se encuentra en la cadena y por útlimo nos dará false porque pese que el literal “pepe” se encuentra dentro de la cadena de texto, la función str_contains es case sensitive, es decir, que distingue entre mayúsculas y minúsculas.

str_starts_with
En siguiente lugar tenemos la función str_starts_with, la cual nos devolverá un boolean en el caso de encontrar el string especificado al principio del otro string, con un ejemplo lo veremos más claro:



Como podéis observar el primer ejemplo nos devuelve true, ya que la cadena names empieza por “pepe”, el segundo ejemplo nos retorna false puesto que no empieza por “pepe” y el último ejemplo nos retorna false, ya que la función es case sensitive.

str_ends_with
Esta función sigue el mismo patrón que la anterior, str_starts_with pero en lugar de buscar al principio de la cadena lo busca al final.


Conclusión

En este artículo he tratado de cubrir las nuevas funcionalidades más relevantes de PHP 8, aún muchas de ellas siguen en el draft, es decir, pendientes de votación y aprobación, por ello pienso que aún puede haber más funcionalidades de aquí hasta el lanzamiento de PHP 8. Es posible que entre las grandes aportaciones que cubre este artículo y las que están por llegar, PHP 8 se convertirá en una de las actualizaciones más populares de PHP, y no solo para los desarrolladores de Web, los cuales tanto usan PHP, sino que gracias a la funcionalidad de JIT podemos decir que PHP se convertirá en más todoterreno y cubrirá espacios a los que antes no llegaba por su rendimiento. ¿Estás preparado?

Gracias por leerme,

Haz click aquí para contactarnos