PHP 8.5.0 Alpha 1: Pipeline hacia el futuro

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 a str_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:

  1. Solo funciona con callables que aceptan un parámetro
  2. El valor siempre se pasa como primer parámetro
  3. 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

  1. Ahora: Experimenta con la alpha en un entorno de desarrollo
  2. Septiembre 2025: Betas empezarán a llegar
  3. Noviembre 2025: Release final

Recursos adicionales

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.

Relacionados