PHP 8.0: ¿Qué hay de nuevo?
desarrollo web aprender a programar programa curso Hackademy Laravel Hackademy Carrera en programación desarrollador full-stack front-end Curriculum Vitae
PHP 8.0 es una actualización importante que contiene muchas características nuevas y optimizaciones destinadas a hacer que este lenguaje sea más rápido y confiable.
Aunque esta versión aún está en desarrollo, ya se han aprobado e implementado muchos RFC (solicitud de comentarios), información sobre nuevas investigaciones e innovaciones.
Entre las principales novedades encontramos:
- Nuevas built-in functions
- Errores de tipos coherentes para las built-in functions
- Constructor Property Promotion
- Union Types 2.0
- Expresión Match
- Operador Nullsafe
- JIT compilation
Nuevas built-in functions
Hasta PHP 7 teníamos que buscar la "aguja" dentro de un "pajar" usando la función strpos (), aunque no era muy intuitivo para todos los nuevos desarrolladores de PHP.
Aquí tienes un ejemplo:
En cambio, la nueva versión 8 nos brinda una nueva función muy intuitiva que nos permite buscar directamente dentro de una cadena, devolviendo verdadero o falso y acepta los mismos parámetros que la anterior:
Sí, lo leíste bien, la función incorporada en cuestión se llama str_contains () y nos recuerda a una función auxiliar de un marco bien conocido que usamos mucho, Laravel.
Además de str_contains (), dos nuevas funciones enriquecen el arsenal disponible para los desarrolladores de PHP para verificar si una cadena comienza o termina con una subcadena específica:
A partir de este ejemplo muy simple entendemos, por tanto, que estas nuevas funciones son óptimas e intuitivas en el punto correcto, orientadas a facilitar la comprensión y por tanto el uso por parte de una audiencia cada vez más amplia pero sobre todo a entrar literalmente en simbiosis con todos los frameworks escritos en PHP.
Errores de tipo coherentes para built-in functions
Otro aspecto actualizado es el del error dado por la validación de los parámetros. La mayoría de las funciones integradas ahora arrojan un error de tipo definido si falla la validación de parámetros, y lo explica de manera consistente.
PHP 7
PHP 8
Las funciones personalizadas, o las definidas por el usuario, ya lanzan un TypeError, pero las funciones internas no, lanzan una advertencia y devuelven un valor nulo.
Desde PHP 8, el comportamiento de error de las funciones integradas se ha hecho coherente, como acabamos de ver.
Constructor Property Promotion
Para mejorar la ergonomía de los objetos en PHP, se ha propuesto una sintaxis nueva y más simple para declarar propiedades. Por tanto, la actualización solo afecta a los parámetros promocionados, es decir, a todos aquellos parámetros precedidos por las palabras clave de visibilidad: público, protegido y privado.
Cuando un parámetro está precedido por una de las palabras clave de visibilidad, se considera "promocionado". Para cada parámetro promocionado, se agregará una propiedad con el mismo nombre y se incluirá una asignación a esa propiedad en el cuerpo del constructor.
Hasta PHP 7, por lo tanto, todas las propiedades tenían que repetirse varias veces antes de que pudieran usarse con objetos, en la declaración, como parámetros del constructor y en la asignación:
Con PHP 8 ya no es necesario declarar una propiedad, definirla como parámetro y finalmente asignarla, sino simplemente definirla directamente como parámetro constructor precedido por la palabra clave de visibilidad elegida, demasiado simple:
Como podemos ver, obtenemos exactamente el mismo resultado, reduciendo significativamente la cantidad de código repetitivo, que es una sección de código repetida una y otra vez dentro de nuestro programa, como explica el creador de este RFC Nikita Popov:
“Es una simple transformación sintáctica lo que estamos haciendo. Pero eso reduce la cantidad de código repetitivo que tienes que escribir especialmente para objetos valiosos, porque para aquellos que usas comúnmente no necesitas mucho más de tus propiedades y constructor ".
Por lo tanto, está claro que si usáramos objetos valiosos, reduciríamos aún más la cantidad de secciones de código reescritas.
Nota: PHP 8 ahora introduce las comas finales en las listas de parámetros de funciones, métodos y cierres (ver ejemplo anterior).
Además, las propiedades promocionadas se pueden usar sin límites incluso en herencia con exactamente la misma sintaxis:
N.B.: Las propiedades promocionadas no están permitidas en clases y rasgos abstractos.
Sin embargo, recomiendo, con fines didácticos, usar primero el método antiguo según el cual una propiedad debe declararse primero, luego definirse como un parámetro y finalmente asignarse en el cuerpo del constructor, para que un nuevo desarrollador PHP entienda cómo hasta que realmente tiene lugar la construcción de un objeto.
Tipos de unión 2.0
Los tipos de unión aceptan valores que pueden ser de diferentes tipos. PHP 7 no proporcionó soporte para tipos de unión que solo podrían especificarse en anotaciones, como se muestra en el ejemplo:
PHP 8 agrega soporte para Tipos de Unión permitiéndonos definirlos dentro de la lista de parámetros de función, con la siguiente sintaxis:
El soporte de Union Types nos permite mover información de tipos de anotaciones a firmas de funciones, pudiendo así detectar errores temprano aplicando tipos y reduciendo la cantidad de código repetitivo en comparación con el antiguo método de anotación phpdoc.
Expresión de coincidencia
Cuando tengo que incluir varias declaraciones condicionales en un solo bloque de código, siempre elijo la construcción del interruptor, que es mucho más legible y más fácil de administrar que el elseif:
Si la condición se satisface en el primer caso, devuélvame la instrucción especificada y salga de la construcción (interrupción); de lo contrario, la verificación continúa. Si la condición no se satisface en ningún caso, devuélvame la declaración predeterminada. Todo bastante sencillo.
PHP 8 ofrece una nueva expresión de coincidencia llamada match, una expresión con una comparación rigurosa cuyo resultado puede almacenarse en una variable o devolverse.
Veamos su comportamiento con respecto al switch con un ejemplo:
PHP 7
PHP 8
Por lo tanto, la expresión de coincidencia funciona sin la interrupción de la declaración. Ejecuta solo la rama coincidente y devuelve el valor inmediatamente, lo que implica romper inmediatamente después de la expresión ejecutada por la rama coincidente.
Sin embargo, se admite la inserción de una instrucción predeterminada muy similar a la de la construcción del conmutador, pero con una sintaxis diferente:
Nota: las ramas de coincidencia solo admiten expresiones de una sola línea y no requieren un salto; una expresión coincidente debe tener una condición que coincida con la expresión o un caso predeterminado para manejarla. Si no hay coincidencias, se produce un error fatal.
Operatore Nullsafe
Si ha utilizado el operador null en el pasado, probablemente también haya notado sus defectos: nulo no funciona en llamadas a métodos. Es necesario realizar comprobaciones intermedias o confiar en ayudantes opcionales proporcionados por algunos frameworks como Laravel.
PHP 7
Con PHP 8 ahora es posible usar una cadena de llamadas con el nuevo operador nullsafe (?), Lo que nos permite también verificar las llamadas al método, veamos cómo:
Nota: cuando falla la evaluación de un elemento de la cadena, la ejecución de toda la cadena se detiene y toda la cadena devuelve nulo.
Compilación JIT
PHP 8 presenta dos nuevos motores de compilación Just-In-Time (JIT): Tracing JIT y Function JIT.
El seguimiento de JIT, el más prometedor de los dos, muestra aproximadamente 3 veces mejor rendimiento en evaluaciones comparativas sintéticas y 1,5-2 veces la mejora en algunas aplicaciones específicas de larga ejecución. El rendimiento típico de una aplicación está a la par con PHP 7.4.
Por lo tanto, podemos definir JIT como un modo de compilación durante el funcionamiento de una aplicación en sí, o en tiempo de ejecución.
La propuesta RFC:
“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 de OPcache y op_array → opcodes []. Los manejadores mantienen punteros a los puntos de entrada del código JIT ".
OPcode? OPcache?
Un código OP (código de operación) es una parte de una instrucción en lenguaje de máquina que especifica las operaciones que se realizarán.
Entonces OPcache, después de la primera vez que se ha ejecutado un determinado script, no hace más que eliminar las fases de carga / análisis / compilación habiéndolos guardado previamente en disco o en RAM (durante la primera ejecución).
En resumen, con la versión 8 todo será significativamente más rápido, pero por el momento la mayor parte del código PHP existente en el mundo mantendrá estándares que todavía son aproximadamente lentos. Sin embargo, se abrirán nuevos desarrollos para la nueva versión PHP compilada por JIT.
Finalmente recomiendo el uso de JIT si tu aplicación está destinada a realizar tareas matemáticas donde la carga de trabajo es considerable, mientras que si el objetivo es usar PHP de manera común, como la mayoría de usuarios de WordPress, las diferencias serán mínimas (ver imagen).
En este artículo he enumerado y descrito las nuevas características más importantes de PHP 8.0 que seguramente aprovecharemos más a menudo, pero las actualizaciones menores y las RFC propuestas no terminan ahí. Para obtener información adicional o ideas, recomiendo y siempre recomendaré el Manual de PHP como una primera opción absoluta, presente en el sitio web oficial www.php.net, desde el cual puede descargar la última versión y en el que puede encontrar ejemplos válidos y concretos sobre todos los métodos descritos en este artículo.
Antonio Masoni
Desarrollador de backend junior y tutor de Hackademy
Aulab.
© 2022 Aulab. Todos los derechos reservados • P.IVA: IT07647440721 • Política de privacidad