Novedades de PHP 8.5
(stitcher.io)- PHP 8.5 es una actualización importante que incluye varias funciones como el operador pipe, clone with y un nuevo analizador de URI
- El operador pipe simplifica las cadenas de llamadas a funciones, mejorando la legibilidad y el mantenimiento
- La función Clone with permite modificar valores de propiedades al mismo tiempo que se clona un objeto, aunque existen restricciones para algunas propiedades readonly
- Se refuerzan las mejoras para desarrolladores con
#[NoDiscard], el cast(void), soporte de expresiones constantes para closures y salida de backtrace en fatal errors - La versión incluye mejoras de detalle en manejo de arreglos, validación de atributos y eliminación de casts no estándar, además de cambios relacionados con compatibilidad hacia atrás
Principales funciones nuevas
-
Con la incorporación del operador pipe (
|>) ahora es posible escribir código en cadena pasando directamente el resultado de una función a la siguiente- Permite una estructura para transformar datos paso a paso en lugar de usar llamadas anidadas
- En el código de ejemplo se conectan secuencialmente
trim,str_replace,strtolowery otras funciones
-
La función Clone with permite cambiar valores de propiedades al clonar un objeto
- En la clase de ejemplo
Book, se usa con la formaclone($this, ['title' => $title]) - Sin embargo, al clonar propiedades readonly desde fuera, se requiere el especificador de acceso
public(set)
- En la clase de ejemplo
-
Se agregan el atributo
#[NoDiscard]y el cast(void)- Es posible marcar funciones para que generen una advertencia si se ignora el valor de retorno
- El cast
(void)permite suprimir esa advertencia
-
Con las mejoras en closures, ahora se pueden usar closures y first-class callable objects dentro de expresiones constantes
- En el ejemplo se definen dentro de un atributo con la forma
#[SkipDiscovery(static function (...))] - Estas closures deben declararse obligatoriamente como
staticy no pueden acceder a variables externas
- En el ejemplo se definen dentro de un atributo con la forma
-
Se añade la salida de backtrace en fatal errors
- La información de rastreo de pila que antes no se mostraba ahora se incluye en el mensaje de error, facilitando la depuración
Funciones relacionadas con arreglos y URI
-
Se agregan las funciones
array_first()yarray_last()- Devuelven de forma simple el primer y el último elemento de un arreglo
- Sustituyen el enfoque más complejo basado en
array_key_first()yarray_key_last()
-
Se incorpora un nuevo analizador de URI
- La clase
Uri\Rfc3986\Uriofrece métodos comogetHost(),getScheme(),getPort()y otros - Simplifica la manipulación y el análisis de URI
- La clase
Funciones relacionadas con atributos y validación
- Se incorpora el atributo
#[DelayedTargetValidation]- Permite posponer de tiempo de compilación a tiempo de ejecución la validación de algunos atributos, como
#[Override] - Su objetivo es aliviar problemas de compatibilidad hacia atrás
- Permite posponer de tiempo de compilación a tiempo de ejecución la validación de algunos atributos, como
Otros cambios menores
- Soporte para visibilidad asimétrica (asymmetric visibility) en propiedades estáticas
- Ahora también se pueden asignar atributos a constantes fuera de clases
- La promoción de propiedades en el constructor (property promotion) ahora también puede aplicarse a propiedades final
- El atributo
#[\Override]ahora también puede aplicarse a propiedades - Se agrega la propiedad Dom\Element::$outerHTML
- La extensión Exif añade soporte para imágenes HEIF/HEIC
- Se agrega la bandera
FILTER_THROW_ON_FAILUREal llamar afilter_var()
Eliminaciones y cambios incompatibles
- Se deja de admitir el uso de nombres de cast no estándar como
(boolean)e(integer) - Se depreca el uso de backticks (```) como alias de
shell_exec() - Se depreca la función de redefinir constantes
- Se elimina la configuración ini
disabled_classes - La lista completa de cambios y deprecaciones puede consultarse en la documentación de actualización de PHP 8.5
Resumen general
- PHP 8.5 es una versión que mejora la experiencia de desarrollo en general, incluyendo legibilidad del código, depuración, manejo de atributos y manipulación de arreglos
- El operador pipe y el analizador de URI tienen un impacto directo en la simplificación del código real de trabajo
- El retraso en la validación de atributos, las nuevas funciones de arreglos y la salida de backtrace aumentan la mantenibilidad y la estabilidad
- Algunas sintaxis y configuraciones no estándar quedan deprecadas, por lo que será necesario ajustar el código
- En conjunto, es un lanzamiento centrado en reforzar la consistencia del lenguaje y mejorar la comodidad para desarrolladores
1 comentarios
Comentarios de Hacker News
Sigo amando PHP
Hace 23 años hice software de cifrado para PHP y todavía funciona bien
Aún llevo un boletín sobre PHP y la comunidad sigue siendo fuerte
También uso Python y Node.js, pero para tareas rápidas y simples siempre termino volviendo a PHP
Aun así, que PHP se haya vuelto mucho más complejo desde PHP 5 me parece un arma de doble filo
Mientras Python pasaba de 2 a 3, PHP evolucionó de 5.2→5.3 y de 5.6→7.0
Con namespaces, autoloading PSR0 y mejoras del parser, la velocidad y la estructura mejoraron mucho
En cada actualización fue mejorando gradualmente sin romper compatibilidad, y además ofreció advertencias y shims para poder mantener versiones antiguas
PHP 6 se canceló por los cambios en el manejo de cadenas, y al final me parece que fue una decisión acertada
Fue un proyecto que respetó al lenguaje y a la comunidad que durante mucho tiempo le dio de comer a mucha gente
Puedes usarlo de forma compleja, pero no es obligatorio
A mediados de los 2000 trabajé con herramientas relacionadas con Zend y recuerdo que eran bastante complicadas
Si aprendes PSR y tienes en cuenta la seguridad y las capacidades modernas, se ha vuelto un lenguaje mucho más estable y potente
La evolución desde PHP 5 ha sido impresionante, pero eso también ha traído el problema de una mayor complejidad
Para quienes aprendieron con versiones antiguas, los codebases actuales se sienten ajenos y difíciles de seguir
Eso es una fortaleza para la comunidad, pero una barrera para desarrolladores que quieren volver
Usé C++ durante 10 años, pero ahora PHP me resulta mucho más fácil de leer que el código moderno de C++
Da la impresión de que el objetivo de la simplicidad desapareció y solo se siguen acumulando funciones
El mundo web cambia especialmente rápido, así que si no te mantienes al día te quedas atrás
PHP es un lenguaje que muchos principiantes usan para hacer su primer sitio web, así que quizá el cambio se siente más fuerte que en otros lenguajes
Mucha gente tiende a avergonzarse de PHP, pero yo no
No sé tanto del lenguaje, pero sí sé que hay muchos proyectos geniales
Mi proyecto favorito de PHP estos días es BookStack, que uso como wiki familiar
Sigue habiendo muchos sitios hechos con stacks de PHP bien mantenidos
Usé PHP en producción entre 2021 y 2023, y más que el lenguaje, el problema eran los codebases viejos y los salarios bajos
Hay mucho código heredado de la época de PHP 4 y los patrones de acceso a datos varían por todos lados, así que el mantenimiento es duro
Pero al migrar a PHP 8, la calidad del código mejoró muchísimo
Si empezara un proyecto nuevo, no elegiría PHP, pero si fuera un proyecto moderno en Laravel, me sumaría con gusto
Pero a los principiantes les resultaba fácil usarlo sin conceptos de seguridad, así que abundaban problemas como la inyección SQL, y por eso se ganó la fama de ser un lenguaje inseguro
Con un framework como Laravel, es un entorno mucho más estable y maduro
Como tocar guitarra o escribir poesía, cualquiera puede hacerlo, pero hacerlo bien es difícil
Aprendo mirando el código y disfruto autoalojar un servidor de radio/música
PHP se ha vuelto un lenguaje cada vez más complejo con cada actualización
Sigue siendo un lenguaje centrado en la web, así que me pregunto por qué evoluciona de esta forma
Al final parece que los lenguajes orientados a objetos tradicionales convergen hacia una dirección parecida
Aunque fuera un lenguaje solo para la web, igual tendría razones de sobra para evolucionar. Mejorar la experiencia del desarrollador siempre vale la pena
array_first(), array_last() son útiles, pero el operador pipe podría perjudicar la mantenibilidad
Como solo admite funciones unarias, en funciones complejas podría incluso provocar más bugs
Lo más interesante del anuncio de PHP 8.5 es la estabilidad y madurez del lenguaje
Sorprende que PHP vaya a añadir array_first, array_last y fatal error stack trace antes que GTA6
Que se sigan añadiendo nuevas funciones y sintaxis a PHP aumenta a largo plazo el costo de mantenimiento
Si miras las notas oficiales de lanzamiento, el valor de algunas funciones es discutible
parse_url()Notas oficiales de lanzamiento de PHP 8.5
Los ejemplos del operador pipe en la mayoría de lenguajes simplemente omiten la forma habitual de usar variables temporales
El ejemplo de parseo de URL tampoco se comparó directamente con
parse_url()parse_url()no sigue completamente el estándar y maneja mal las URLs relativasLa nueva función
uri()es más limpia, y si se añade soporte para aplicación parcial de funciones, las cadenas con pipe serán más legiblesSolía llamar a **shell_exec() con backticks (
)** en PHP CLI, pero ahora quedó deprecated Usaba mucho cosas comomkdir $dirname`Hay riesgo de inyección de metacaracteres del shell, así que conviene usar
mkdir()opcntl_exec()de PHP