La primera versión alpha de PHP 8.5 acaba de ser liberada, y debo confesar que me tiene más emocionado que las últimas versiones. No es solo por las mejoras técnicas (que son muchas), sino porque PHP 8.5 introduce características que van a cambiar la forma en que escribimos código.
Y cuando digo “cambiar”, me refiero a ese tipo de cambios que, una vez que los usas, no puedes volver atrás. Como cuando apareció el null coalescing operator (??
) en PHP 7, o las arrow functions en PHP 7.4.
La estrella del show: El Pipe Operator (|>)
Sin duda, el pipe operator es la característica que más ruido está generando, y con razón. Nos permite encadenar funciones de manera elegante, pasando el resultado de una función directamente a la siguiente.
El problema que resuelve
¿Cuántas veces has escrito esto?
$result = trim(strtoupper(str_replace(' ', '-', $input)));
O la versión “más legible” con variables temporales:
$step1 = str_replace(' ', '-', $input);
$step2 = strtoupper($step1);
$result = trim($step2);
La solución elegante en PHP 8.5
Con el pipe operator, el mismo código se ve así:
$result = $input
|> str_replace(' ', '-', ...)
|> strtoupper(...)
|> trim(...);
¿Qué está pasando aquí?
- El valor de
$input
se pasa como primer parámetro astr_replace()
- El resultado se pasa a
strtoupper()
- Y finalmente a
trim()
- Los
...
indican que estamos usando first-class callables
Ejemplo práctico: Creando un slug
$title = " Hello World! This is a Test. ";
// Antes (nested hell)
$slug = strtolower(
str_replace(['.', '!', '?'], '',
str_replace(' ', '-',
trim($title)
)
)
);
// Con pipe operator
$slug = $title
|> trim(...)
|> str_replace(' ', '-', ...)
|> fn($s) => str_replace(['.', '!', '?'], '', $s)
|> strtolower(...);
Limitaciones importantes
El pipe operator tiene algunas restricciones que debes conocer:
- Solo funciona con callables que aceptan un parámetro
- El valor siempre se pasa como primer parámetro
- Para funciones multi-parámetro, necesitas usar arrow functions
// ❌ No funcionará - str_replace necesita 3 parámetros
$result = $input |> str_replace(' ', '-', ...);
// ✅ Correcto - usando arrow function
$result = $input |> fn($s) => str_replace(' ', '-', $s);
#[\NoDiscard]: Adiós a los errores silenciosos
Esta es otra característica que me parece brillante. El atributo #[\NoDiscard]
permite marcar funciones cuyo valor de retorno no debe ser ignorado.
El problema
function processPayment($amount): PaymentResult {
// ... lógica de procesamiento
return new PaymentResult($success, $errorMessage);
}
// ❌ Error silencioso - ignoramos el resultado
processPayment(100);
// ✅ Correcto - usamos el resultado
$result = processPayment(100);
if (!$result->success) {
handleError($result->errorMessage);
}
La solución
#[\NoDiscard]
function processPayment($amount): PaymentResult {
// ... lógica de procesamiento
return new PaymentResult($success, $errorMessage);
}
// Ahora PHP emitirá un WARNING si ignoras el resultado
processPayment(100); // Warning: The return value should be used
// Puedes suprimir intencionalmente con (void)
(void) processPayment(100); // OK - intencionalmente ignorado
Mensaje personalizado
#[\NoDiscard("Payment results must be checked for errors")]
function processPayment($amount): PaymentResult {
// ...
}
Funciones core con NoDiscard
PHP 8.5 ya incluye #[\NoDiscard]
en funciones críticas como:
flock()
- Ignorar su resultado puede causar problemas de concurrencia- Métodos de
DateTimeImmutable
- Devuelven nuevas instancias, no modifican la original
Final Property Promotion
PHP 8.5 permite usar final
directamente en la promoción de propiedades del constructor:
class User {
public function __construct(
public readonly string $name,
public final string $email, // ✅ Nuevo en PHP 8.5
) {}
}
Esto evita que las clases hijas puedan sobrescribir la propiedad $email
.
Closures estáticos en expresiones constantes
Una característica técnica pero muy útil para library authors:
class Configuration {
public const VALIDATOR = static function(string $value): bool {
return strlen($value) > 0;
};
public const TRANSFORMER = static function(string $value): string {
return strtoupper($value);
};
}
Nuevas funciones de array
PHP 8.5 añade dos funciones que llevábamos tiempo esperando:
$numbers = [1, 2, 3, 4, 5];
$first = array_first($numbers); // 1
$last = array_last($numbers); // 5
// También funcionan con callbacks
$first_even = array_first($numbers, fn($n) => $n % 2 === 0); // 2
Mejoras en extensiones
La alpha 1 incluye mejoras significativas en muchas extensiones:
cURL
- Nuevas constantes
CURLFOLLOW_ALL
,CURLFOLLOW_OBEYCODE
- Función
curl_multi_get_handles()
- Soporte para
CURLINFO_USED_PROXY
DOM
Dom\Element::$outerHTML
Dom\Element::insertAdjacentHTML()
- Nueva propiedad
$children
para ParentNode
MySQLi
- Nueva opción
mysqlnd.collect_memory_statistics
PDO
- Soporte para iterables en
PDO::pgsqlCopyFromArray
- Nuevas constantes en PDO_SQLite
Mejoras en el CLI
Una mejora pequeña pero útil:
# Nuevo flag para ver solo configuraciones cambiadas
php --ini=diff
Información de la release
Versión: 8.5.0alpha1
Fecha de release: Versión QA (no para producción)
GA programada: 20 de noviembre de 2025
Branch status: Desarrollo activo
Cómo probar PHP 8.5
Docker (recomendado)
# PHP CLI
docker pull php:8.5.0alpha1-cli
# PHP con Apache
docker pull php:8.5.0alpha1-apache
# PHP-FPM
docker pull php:8.5.0alpha1-fpm
Compilación desde código fuente
git clone https://github.com/php/php-src.git --depth 1 --branch php-8.5.0alpha1
cd php-src
./buildconf
./configure --enable-debug
make -j$(nproc)
Binarios Windows
Disponibles para descargar desde windows.php.net tanto en versiones Thread-Safe como Non-Thread-Safe.
Mi experiencia con la alpha
He estado jugando con la alpha durante unas semanas, y estas son mis impresiones:
El pipe operator es adictivo
Una vez que empiezas a usarlo, es difícil parar. Es especialmente útil para:
- Transformaciones de datos
- Validación y sanitización
- Procesamiento de strings
- Operaciones funcionales
NoDiscard es gold para libraries
Como library author, #[\NoDiscard]
es exactamente lo que necesitaba. Finalmente puedo forzar a los usuarios a manejar correctamente los valores de retorno críticos.
La estabilidad es sorprendente
Para ser una alpha, PHP 8.5 se siente bastante estable. He ejecutado algunas de mis aplicaciones Laravel sin problemas mayores.
Consideraciones de compatibilidad
Código existente
El pipe operator usa nueva sintaxis, por lo que tu código existente seguirá funcionando sin cambios.
Herramientas de desarrollo
- PHPStan y Psalm ya están trabajando en soporte para las nuevas características
- PHP-CS-Fixer y PHP CodeSniffer necesitarán actualizaciones
- Los IDEs como PhpStorm probablemente añadirán soporte en sus próximas versiones
El futuro se ve prometedor
PHP 8.5 marca un punto de inflexión. El pipe operator no es solo sintactic sugar - es una forma fundamentalmente diferente de escribir código PHP. Más funcional, más legible, más expresivo.
Y #[\NoDiscard]
va a hacer que muchas libraries sean más robustas y seguras.
Próximos pasos
- Ahora: Experimenta con la alpha en un entorno de desarrollo
- Septiembre 2025: Betas empezarán a llegar
- Noviembre 2025: Release final
Recursos adicionales
- PHP 8.5 Release Information - Información oficial de la release
- PHP 8.5 RFCs - Todos los RFCs aprobados
- Pipe Operator RFC - Documentación técnica del pipe operator
- NoDiscard RFC - Documentación del atributo NoDiscard
- PHP 8.5 Features Overview - Resumen completo de características
- Pipe Operator Tutorial - Tutorial detallado del pipe operator
Conclusión
PHP 8.5 no es solo una actualización más - es una evolución significativa del lenguaje. El pipe operator va a cambiar la forma en que estructuramos nuestro código, y #[\NoDiscard]
va a hacer que sea más robusto.
¿Ya has probado la alpha? ¿Qué opinas del pipe operator? Me encantaría conocer tu experiencia y casos de uso.
¿Te ha resultado útil este artículo? Compártelo con otros desarrolladores PHP que puedan estar interesados en las novedades de PHP 8.5. Y si tienes alguna pregunta o experiencia que compartir, no dudes en contactarme.