PHP 8.6.0 RC3 se etiquetó el 8 de octubre de 2026. El calendario fija la disponibilidad general para el 19 de noviembre de 2026 y mantiene RC4 y RC5 en el plan. Aún pueden producirse cambios antes de la versión final. Este análisis utiliza los archivos UPGRADING y NEWS del tag RC3 y el estado del código integrado. La investigación se cerró el 11 de octubre de 2026.
La novedad principal es la aplicación parcial de funciones. La propuesta fue aprobada por unanimidad y se incorporó en alpha3. Un llamamiento con ? para un argumento ausente o ... para cero o más argumentos restantes devuelve una Closure. La sintaxis strlen(...) sigue conceptualmente el mismo modelo sin argumentos fijados. La función resulta útil en llamadas a array_map(), que ahora pueden compilarse como un bucle cuando reciben una callable de primera clase o una aplicación parcial, según UPGRADING.
El operador pipe, introducido en PHP 8.5, exige una callable de un argumento a la derecha de |>. La aplicación parcial permite expresar llamadas canalizadas con varios argumentos fijos sin una función flecha. Cuando una aplicación parcial con un solo placeholder aparece directamente después de |>, el compilador puede convertirla en una llamada directa y evitar la creación de una Closure. Con dos o más placeholders sí se crea una Closure.
Los argumentos fijados se evalúan al crear la aplicación parcial. Una función flecha evalúa su cuerpo en cada ejecución. La diferencia importa cuando el valor procede de una expresión cambiante como date('H:i:s'). Cada ? crea un parámetro obligatorio, incluso si el parámetro original tiene un valor predeterminado. Los parámetros introducidos mediante ... conservan su carácter opcional y los parámetros opcionales que no cubre ningún placeholder mantienen sus defaults. Algunos ejemplos de los primeros textos RFC ya no describen el comportamiento de RC3.
Las propiedades readonly pueden declarar valores predeterminados, también dentro de readonly classes. Ese valor cuenta como la inicialización inicial, por lo que el constructor no puede asignar la propiedad de nuevo. Para valores configurables conviene un parámetro de constructor promovido con un valor predeterminado. __clone() y clone-with pueden volver a inicializar la propiedad una vez. La nueva función clamp(mixed $value, mixed $min, mixed $max): mixed usa las comparaciones habituales de PHP y admite strings y objetos DateTimeInterface. Lanza ValueError si el límite mínimo supera al máximo o si uno de los límites es NAN.
Time\Duration es una clase final readonly para duraciones exactas con precisión de nanosegundos. Sus fábricas con nombre crean valores a partir de segundos, minutos y cadenas de duración ISO 8601. Permite comparaciones y las operaciones add() y sub(). Los operadores + y - no están disponibles. La clase no se integra con DateTime ni DateInterval, y funciones como sleep() no aceptan Duration. Su utilidad actual se concentra en la configuración tipada de tiempos de espera y en la API de polling.
Los valores predeterminados de sesión presentan el mayor riesgo inmediato. session.use_strict_mode cambia de 0 a 1, session.cookie_httponly de 0 a 1 y session.cookie_samesite pasa de no estar definido a Lax. PHP rechazará identificadores de sesión que no haya creado, JavaScript perderá el acceso mediante document.cookie y las cookies dejarán de enviarse con peticiones POST entre sitios. Hay que probar los gestores de sesión personalizados, las sesiones compartidas entre subdominios o servicios, los bindings POST de SAML y los callbacks de proveedores de pago. Las aplicaciones que dependan de los valores anteriores deben fijarlos explícitamente.
La validación de argumentos se endurece en el runtime. Los modos y flags inválidos afectan, entre otras, a array_filter(), array_change_key_case(), pathinfo() y scandir(). Los valores numéricos fuera de rango pueden hacer que number_format(), sleep() y usleep() lancen ValueError. Los bytes NUL en getenv(), putenv(), parse_str(), setlocale() y en funciones de archivos como file_exists(), is_file(), filesize() y stat() provocan ahora excepciones. Antes podían truncarse o rechazarse de forma silenciosa. trim(), ltrim() y rtrim() también eliminan form feed por defecto. base_convert(), bindec(), hexdec() y octdec() emiten un notice cuando la conversión no es precisa, y preg_grep() devuelve false ante un error de ejecución. GMP, Intl, GD, Sodium y otras extensiones aplican controles similares.
La nueva opción INI error_include_args añade los argumentos de las funciones a los mensajes de error y viene desactivada. Los valores marcados con #[\SensitiveParameter] se ocultan, pero los demás pueden llegar a los logs. Ante un error fatal de memoria, PHP llama ahora a abort(), con código de salida 134 y la posibilidad de escribir un core dump. Hay que revisar supervisores y alertas que dependan de códigos de salida. Un foreach por referencia puede volver a visitar elementos después de compactar un array. ?? y empty() ya no llaman a __get() sobre propiedades mágicas después de que __isset() haya escrito la propiedad.
La mayoría de las deprecaciones preparan PHP 9. Los alias escalares is_integer(), is_long(), is_double() y doubleval() tienen reemplazos canónicos. spl_object_hash() deja paso a spl_object_id(), cuyo resultado es un entero y puede afectar a datos serializados y claves de caché. El tercer argumento de define(), spl_classes() y mysqli_get_charset() está deprecated. Los retornos desde finally, los valores devueltos por __construct() o __destruct(), las llamadas con strings a is_a() o is_subclass_of() cuando allow_string es false y el paso de objetos a array_walk() o http_build_query() requieren revisar la intención del código.
También se deprecian varios métodos de ordenación, flags y serialización de ArrayIterator, como asort(), ksort(), uasort(), setFlags() y serialize(). En SplFileObject están afectados métodos CSV como fgetcsv(), fputcsv(), setCsvControl() y getCsvControl(). La lista incluye gestores de sesión personalizados sin create_sid() y validateId(). mbregex merece planificación temprana porque la biblioteca Oniguruma dejó de mantenerse. La familia mb_ereg(), mb_eregi(), mb_ereg_replace(), mb_split() y mb_regex_encoding() está deprecated y su eliminación está prevista para PHP 9.0. La migración a PCRE con el modificador u suele ser posible, pero los dialectos difieren y exigen pruebas. Las propuestas para deprecar list() y el alias gettext _() no fueron aprobadas.
Io\Poll añade una primitiva orientada a objetos para bucles de eventos. Incluye Context, selección automática de backends para epoll, kqueue, poll, event ports y WSAPoll, watchers tipados para handles de streams y wait() con un timeout Time\Duration. La página del RFC aún muestra una firma antigua de wait() basada en enteros. La API está dirigida a runtimes asíncronos, servidores de sockets y gestores de procesos. Los contextos de streams pueden convertir errores en excepciones mediante StreamErrorMode::Exception. Así, clientes HTTP, adaptadores de almacenamiento y trabajos de importación pueden capturar StreamException y consultar sus errores. El comportamiento predeterminado sigue produciendo warnings.
La extensión URI incorpora los builders fluidos Uri\Rfc3986\UriBuilder y Uri\WhatWg\UrlBuilder, inspección del tipo de host y de URI, y una función de codificación porcentual WHATWG. Las mejoras sirven para redirecciones, URL firmadas y controles SSRF. El trabajo de rendimiento incluye caché de closures sin estado, compilación de llamadas a printf() y array_map(), una VM TAILCALL más rápida en Windows con Clang, codificación JSON acelerada y funciones de arrays y strings más rápidas. Los beneficios previstos son graduales y dependen de la carga de trabajo.
True Async no forma parte de PHP 8.6 porque su RFC fue cancelado. La inferencia automática de closures estáticas tampoco se integró. Solo llegó la caché de closures sin estado del RFC de optimización, y las closures declaradas explícitamente como static obtienen el beneficio completo. SortDirection añade Ascending y Descending, pero las funciones de ordenación existentes siguen usando SORT_ASC y SORT_DESC. Las constantes de scandir() permanecen sin cambios. El nuevo método de reflexión se llama ReflectionProperty::isWritable().
El proceso de actualización debería comenzar con la suite completa en CI sobre RC3, con E_DEPRECATED visible en los logs, y con una comprobación de que el framework y las dependencias declaran compatibilidad con PHP 8.6. Conviene comparar la configuración efectiva de sesiones y probar login, SSO y callbacks de pago de extremo a extremo. También hay que rastrear entradas de usuario hacia funciones de archivos, entorno y locale, y registrar mbregex, return en finally y los métodos SPL deprecated. Antes del despliegue, un entorno de staging con tráfico similar al real debe vigilar errores y códigos de salida. Los proyectos que arrastren varias versiones de PHP necesitan un plan de migración más amplio.




Comentarios
Aún no hay comentarios — escribe el primero.
Inicia la conversación
Sin cuenta ni contraseña — introduce tu correo y te enviamos un enlace de acceso de un solo uso. ¿Primera vez? Todo se configura automáticamente.
Tu valoración se aplicará automáticamente al iniciar sesión.
Revisa tu bandeja de entrada
Hemos enviado un enlace de acceso a …. Ábrelo en este dispositivo — esta pestaña te conectará automáticamente.
¿No llega nada? Mira en la carpeta de spam — y marca el correo como «No es spam» para que la próxima vez llegue directo.