Los nombres de las clausuras se han ajustado para incluir el nombre de la función padre y la línea de definición para hacerlos más fáciles de distinguir, por ejemplo, en las trazas de pila.
Ahora se permiten las conmutaciones de fibras durante la ejecución del destructor. Esto estaba previamente bloqueado debido a conflictos con la recolección de basura.
Los destructores ahora pueden ejecutarse en una fibra separada:
Cuando el recolector de basura se activa en una fibra, los destructores llamados por el recolector de basura se ejecutan en una fibra separada: la gc_destructor_fiber. Si esta fibra se suspende, se crea una nueva para ejecutar los destructores restantes. La gc_destructor_fiber anterior ya no es referenciada por el recolector de basura y puede ser recolectada si ya no es referenciada en otro lugar. Los objetos cuyo destructor está suspendido no serán recolectados hasta que el destructor regrese o hasta que la Fiber sea recolectada.
Los flags de estado de los manejadores de salida pasados al parámetro flags
de ob_start() ahora se borran.
output_add_rewrite_var() ahora usa
url_rewriter.hosts
en lugar de
session.trans_sid_hosts
para la selección de los hosts que serán reescritos.
Se ha eliminado el soporte para Apache 2.0 y 2.2 EOL. La versión mínima de Apache requerida ahora es 2.4.
El servidor integrado busca un archivo índice de manera recursiva recorriendo los directorios padres si no se puede localizar el archivo especificado. Este proceso anteriormente se ignoraba si la ruta parecía referirse a un archivo, es decir, si el último componente de la ruta contenía un punto. En ese caso, se devolvía un error 404. El comportamiento se ha modificado para buscar un archivo índice en todos los casos.
Ahora se tendrá éxito al vaciar las cabeceras sin cuerpo.
La página de estado ahora tiene un nuevo campo para mostrar un pico de memoria.
Se ha eliminado la configuración /dev/poll de events.mechanism
para Solaris/Illumos.
trigger_error() y user_error() ahora tienen un tipo de retorno de true en lugar de bool.
DOMDocument::registerNodeClass()
ahora tiene un tipo de retorno de true en lugar de
bool.
Solo podía devolver true
en la práctica.
hash_update()
ahora tiene un tipo de retorno de true en lugar de
bool.
Solo podía devolver true
en la práctica.
NumberFormatter::ROUND_TOWARD_ZERO
y
NumberFormatter::ROUND_AWAY_FROM_ZERO
se han añadido como alias para
NumberFormatter::ROUND_DOWN
y
NumberFormatter::ROUND_UP
para ser coherentes con los nuevos modos
PHP_ROUND_*
.
ResourceBundle::get()
ahora tiene un tipo de retorno provisional de ResourceBundle|array|string|int|null
.
Las funciones idn_to_ascii() y idn_to_utf8()
ahora siempre lanzan excepciones ValueError
si el nombre de domain
está vacío o es demasiado largo.
Las funciones idn_to_ascii() y idn_to_utf8()
ahora siempre lanzan excepciones ValueError
si el parámetro variant
no es
INTL_IDNA_VARIANT_UTS46
.
libxml_set_streams_context() ahora lanza inmediatamente una TypeError cuando se pasa un recurso no contextual de flujo a la función, en lugar de lanzar más tarde cuando se usa el contexto de flujo.
El comportamiento de mb_strcut() ahora es más coherente en cadenas UTF-8 y UTF-16 no válidas. No hay cambio de comportamiento para cadenas UTF-8 y UTF-16 válidas.
El row
de
odbc_fetch_object(),
odbc_fetch_array(), de
odbc_fetch_into() ahora tiene un valor predeterminado de null
,
manteniéndose coherente con odbc_fetch_row().
Anteriormente, los valores predeterminados eran
-1
,
-1
,
y 0
,
respectivamente.
El extra_attributes
en
openssl_csr_new() establece los atributos del
CSR en lugar del DN del sujeto, lo cual se hacía incorrectamente antes.
El dn
en
openssl_csr_new() permite establecer un array
de valores para una sola entrada.
Se ha añadido un nuevo serial_hex
a
openssl_csr_sign() para permitir establecer números de serie
en formato hexadecimal.
Analizar un ASN.1 UTCTime con openssl_x509_parse()
falla si se omiten los segundos para versiones de OpenSSL anteriores a 3.2
(-1
se devuelve para dichos campos).
Las versiones de OpenSSL superiores a 3.3 ya no cargaban dichos certificados.
Ahora es posible recuperar el valor del atributo
PDO::ATTR_STRINGIFY_FETCHES
con
PDO::getAttribute().
Se ha añadido una nueva constante PDO::PGSQL_ATTR_RESULT_MEMORY_SIZE
para recuperar el uso de memoria de los resultados de consulta con
PDO::getAttribute() para los controladores que lo soportan.
Ahora es posible recuperar el valor de los atributos
FB_ATTR_DATE_FORMAT
,
FB_ATTR_TIME_FORMAT
,
FB_ATTR_TIMESTAMP_FORMAT
,
con
PDO::getAttribute().
Se han añadido nuevos atributos para especificar el nivel de aislamiento de transacción y el modo de acceso. Se han añadido cinco constantes relacionadas con esta funcionalidad:
Pdo\Firebird::TRANSACTION_ISOLATION_LEVEL
Pdo\Firebird::READ_COMMITTED
Pdo\Firebird::REPEATABLE_READ
Pdo\Firebird::SERIALIZABLE
Pdo\Firebird::WRITABLE_TRANSACTION
Al usar conexiones persistentes, ahora hay una verificación de liveness en el constructor.
El contenido que se construye cambia según el valor de
FB_API_VER
en
ibase.h.
Un nuevo método estático Pdo\Firebird::getApiVersion()
puede usarse para obtener esta información.
Esta información también se referencia ahora en phpinfo().
Ahora hay cinco nuevos tipos de datos disponibles:
INT128
, DEC16
, DEC34
, TIMESTAMP_TZ
, TIME_TZ
.
Estos están disponibles a partir de Firebird 4.0.
Ahora es posible recuperar el valor del atributo
PDO::ATTR_FETCH_TABLE_NAMES
con
PDO::getAttribute().
Soporte para recuperar el uso de memoria de consultas para
PDO::PGSQL_ATTR_RESULT_MEMORY_SIZE
.
Si la columna es de tipo FLOAT4OID
o
FLOAT8OID
el valor ahora se devolverá como
float en lugar de una string.
El parámetro conditions
de
pg_select() ahora es opcional y acepta un array vacío.
Los métodos Phar::setAlias(), Phar::setDefaultStub() ahora pueden tener un tipo de retorno provisional de true en lugar de bool.
posix_isatty() ahora establece el número de error cuando el argumento del descriptor de archivo/flujo es inválido.
ReflectionGenerator::getFunction() ahora puede ser llamado después de que el generador haya terminado de ejecutarse.
El parámetro backlog
de
socket_create_listen() ahora tiene un valor predeterminado de
SOMAXCONN
.
Anteriormente, era 128
.
Las funciones sodium_crypto_aead_aes256gcm_()* ahora están disponibles en procesadores aarch64 con extensiones criptográficas ARM.
Los métodos SplPriorityQueue::insert(), SplPriorityQueue::recoverFromCorruption(), SplHeap::insert(), SplHeap::recoverFromCorruption() ahora pueden tener un tipo de retorno provisional de true en lugar de bool.
SplObjectStorage ahora implementa SeekableIterator.
El valor predeterminado del 'cost'
para el algoritmo de hashing PASSWORD_BCRYPT
usado por la función password_hash() se ha incrementado de
10
a 12
.
debug_zval_dump() ahora indica si un array está compactado.
long2ip() ahora tiene un tipo de retorno de string
en lugar de string|false
.
highlight_string() ahora tiene un tipo de retorno de
string|true en lugar de string|bool
.
print_r() ahora tiene un tipo de retorno de
string|true en lugar de string|bool
.
El parámetro mode
de la función round() se ha ampliado para aceptar
RoundingMode|int
,
aceptando instancias de un nuevo enumerador RoundingMode.
Se han añadido cuatro nuevos modos a la función round(): RoundingMode::PositiveInfinity, RoundingMode::NegativeInfinity, RoundingMode::TowardsZero, RoundingMode::AwayFromZero
La implementación interna del redondeo a enteros se ha reescrito para ser más fácil de verificar
para la corrección y más fácil de mantener.
Se corrigieron algunos errores de redondeo como resultado de la reescritura.
Por ejemplo, anteriormente, redondear 0.49999999999999994
al entero más cercano
habría dado 1.0
en lugar del resultado correcto 0.0
.
Otras entradas también podrían verse afectadas y dar resultados diferentes
en comparación con versiones anteriores de PHP.
Se corrigió un error causado por el "preredondeo" de la función round().
Anteriormente, usando "preredondeo" para manejar un valor como 0.285
(en realidad 0.28499999999999998
) como un número decimal y redondearlo a 0.29
.
Sin embargo, el "preredondeo" redondeaba incorrectamente algunos números,
por lo que esta corrección elimina el "preredondeo" y cambia la forma en que se comparan los números,
por lo que los valores se redondean correctamente como números decimales.
El número máximo de dígitos significativos que round() puede manejar se ha ampliado
en un dígito.
Por ejemplo, round(4503599627370495.5)
devolvía
4503599627370495.5
,
pero ahora devuelve 4503599627370496
.
La versión mínima requerida de libcurl ahora es 7.61.0.
La opción CURLOPT_DNS_USE_GLOBAL_CACHE
ya no
tiene ningún efecto y se ignora silenciosamente.
Esta funcionalidad subyacente se desaprobó en libcurl 7.11.1,
y se eliminó en libcurl 7.62.0.
Cambiar el tipo de un objeto GMP a bool ahora es
posible en lugar de generar un E_RECOVERABLE_ERROR
.
El comportamiento de conversión está sobrecargado de manera que un objeto GMP
que represente el valor 0
se convierte en false
.
La versión mínima requerida de libxml2 ahora es 2.9.4.
El comportamiento de la clase Intl se ha normalizado para siempre lanzar excepciones Error al intentar usar un objeto no inicializado, o cuando la clonación falla.
Las tablas de datos Unicode se han actualizado a Unicode 16.0.
Se ha añadido soporte para el nuevo tipo de datos VECTOR de MySQL 9.
La versión mínima requerida de OpenSSL ahora es 1.1.1.
La versión mínima requerida de libpq ahora es 10.0.
La versión mínima requerida de libpq ahora es 10.0.
Los accesos fuera de límites en SplFixedArray ahora lanzan excepciones de tipo OutOfBoundsException en lugar de RuntimeException. Como OutOfBoundsException es una clase hija de RuntimeException, no se observa ningún cambio de comportamiento al intentar capturar estas excepciones.
Las propiedades tipadas XSLTProcessor::$cloneDocument y XSLTProcessor::$doXInclude ahora están declaradas.
La versión mínima requerida de zlib ahora es 1.2.11.
Mejora del rendimiento del análisis y la generación de números de punto flotante en construcciones ZTS bajo cargas muy concurrentes. Esto afecta a las funciones printf() así como a las funciones de serialización como json_encode() o serialize().
sprintf() usando solo %s
y
la interpolación de cadena %d
se compilará en la interpolación
de cadena equivalente, evitando los costos de una llamada a función y
el análisis repetido de la cadena de formato.
Mejora del rendimiento de las conversiones de números y las operaciones.
El rendimiento de DOMNode::C14N() se mejora enormemente para el caso sin consulta xpath. Esto puede dar una mejora de tiempo fácilmente de dos órdenes de magnitud para documentos con decenas de miles de nodos.
Mejora del rendimiento y reducción del consumo de memoria de la serialización XML.
Reducción del consumo de memoria de las clases de nodos.
Mejora del rendimiento de las subidas FTP hasta un factor de 10x para las subidas voluminosas.
Se han añadido las implementaciones SSE2 y SHA-NI de SHA-256. Esto mejora el rendimiento en procesadores compatibles de ~1.3x (SSE2), y 3x - 5x (SHA-NI). Crédito a Colin Percival / Tarsnap por esta optimización.
mb_strcut() ahora es mucho más rápido para cadenas UTF-8 y UTF-16.
La búsqueda de nombres de codificación mbstring ahora es mucho más rápida.
El rendimiento de la conversión de SJIS-win a Unicode se mejora enormemente.
Mejora del rendimiento de la cotización MySQLnd.
Mejora del rendimiento de los grupos de captura nombrados.
Mejora del rendimiento de Random\Randomizer, con un enfoque específico en los métodos Random\Randomizer::getBytes(), y Random\Randomizer::getBytesFromString()().
Mejora del rendimiento y reducción del consumo de memoria de la serialización XML.
El rendimiento de strspn() y strcspn() se mejora enormemente. Ahora se ejecutan en tiempo lineal en lugar de estar limitados por un tiempo cuadrático.
Mejora del rendimiento de strpbrk().
get_browser() ahora es mucho más rápido, hasta 1.5x - 2.5x para algunos casos de prueba.