Las propiedades readonly ahora pueden declarar valores por defecto.
<?php
class Config
{
public readonly int $timeout = 30;
}
$config = new Config();
var_dump($config->timeout); // int(30)Ahora es posible utilizar la asignación por referencia en un WeakMap sin que la clave deba estar presente previamente.
<?php
$obj = new stdClass();
$map = new WeakMap();
$count = 0;
// Anteriormente: Error: "Object stdClass#1 not contained in WeakMap"
$map[$obj] = &$count;
$count++;
var_dump($map[$obj]); // int(1)Ahora es posible definir el método mágico __debugInfo() en las enumeraciones. Anteriormente, esto provocaba un error fatal.
<?php
enum Suit: string
{
case Hearts = 'H';
case Spades = 'S';
public function __debugInfo(): array
{
return ['suit' => $this->name, 'symbol' => $this->value];
}
}
var_dump(Suit::Hearts);El ejemplo anterior mostrará:
enum(Suit::Hearts) (2) {
["suit"]=>
string(6) "Hearts"
["symbol"]=>
string(1) "H"
}
#[\Override] para las constantes de claseEl atributo Override ahora puede aplicarse a las constantes de clase, incluidos los casos de enumeración. Al igual que con los métodos y las propiedades, se produce un error en tiempo de compilación si no existe ninguna constante correspondiente en una clase padre o en una interfaz implementada.
<?php
interface HasVersion
{
const VERSION = '1.0';
}
class Package implements HasVersion
{
#[\Override]
const VERSION = '2.0';
// Fatal error: Package::NAME has #[\Override] attribute,
// but no matching parent constant exists
// #[\Override]
// const NAME = 'package';
}
Se ha añadido soporte para la aplicación parcial de funciones. Una llamada
en la que uno o más argumentos se sustituyen por el marcador
?, o los argumentos restantes por el marcador
..., crea una Closure que acepta
los argumentos que faltan.
<?php
function add(int $a, int $b, int $c = 0): int
{
return $a + $b + $c;
}
// "?" sustituye exactamente un argumento
$addOne = add(1, ?);
var_dump($addOne(5)); // int(6)
// "..." sustituye todos los argumentos restantes
$addToOne = add(1, ...);
var_dump($addToOne(2, 3)); // int(6)
// Funciona con cualquier callable, incluidas las funciones internas
$stripSpaces = str_replace(' ', '', ?);
var_dump($stripSpaces('a b c')); // string(3) "abc"
Los objetos almacenados en constantes o en constantes de clase ahora
pueden modificarse directamente mediante OBJ->prop = $val.
<?php
const CONFIG = new stdClass();
// Anteriormente: "Fatal error: Cannot use temporary expression in write context"
CONFIG->debug = true;
var_dump(CONFIG->debug); // bool(true)
pack() y unpack() ahora aceptan los
modificadores < (little-endian) y
> (big-endian) después de los códigos de formato de
enteros s, S, l,
L, q y Q, y
después de los códigos de formato de coma flotante f y
d.
<?php
echo bin2hex(pack('l>', 1)), PHP_EOL; // Muestra "00000001"
echo bin2hex(pack('l<', 1)), PHP_EOL; // Muestra "01000000"
echo bin2hex(pack('f>', 1.5)), PHP_EOL; // Muestra "3fc00000"
var_dump(unpack('s>value', "\xff\xfe")); // ["value" => int(-2)]
El array devuelto por curl_getinfo() ahora incluye una
nueva clave "size_delivered", que indica el número total
de bytes pasados a la función de retrollamada de escritura de la descarga.
Este valor también puede obtenerse pasando
CURLINFO_SIZE_DELIVERED como parámetro
option.
Requiere libcurl 8.20.0 o posterior.
Se ha añadido CURLOPT_SEEKFUNCTION para registrar una
función de retrollamada que reposiciona el cuerpo de una petición enviada
en flujo, de modo que libcurl pueda rebobinarlo y reenviarlo en una
redirección, en una autenticación de varios pasos o en un reintento sobre
una conexión reutilizada, en lugar de fallar con
CURLE_SEND_FAIL_REWIND.
La función de retrollamada recibe el CurlHandle, el
desplazamiento y el origen, y debe devolver uno de los valores
CURL_SEEKFUNC_OK,
CURL_SEEKFUNC_FAIL o
CURL_SEEKFUNC_CANTSEEK.
Se ha añadido la clase Time\Duration.
finfo_file() ahora funciona con flujos remotos.
Se ha añadido gmp_powm_sec() para la exponenciación modular resistente a ataques por canales laterales. Requiere GNU MP 5.0.0 o posterior; no está disponible en las compilaciones oficiales para Windows que utilizan MPIR.
Se ha añadido gmp_prevprime() para obtener el mayor
número primo menor que el número dado.
El parámetro de salida opcional definitely_prime
indica si el número devuelto es definitivamente primo, en lugar de
probablemente primo.
Se lanza una ValueError si no existe tal
número primo.
Esta función solo está disponible cuando PHP se compila con GNU MP 6.3.0 o
posterior; no está disponible en las compilaciones oficiales para Windows
que utilizan MPIR.
Se han añadido los métodos estáticos IntlDatePatternGenerator::getSkeleton() y IntlDatePatternGenerator::getBaseSkeleton() para generar el esqueleto único y el esqueleto base de un patrón de fecha/hora.
Se han añadido Locale::getDisplayKeyword() y Locale::getDisplayKeywordValue(), con los alias locale_get_display_keyword() y locale_get_display_keyword_value(), respectivamente.
Se ha añadido la clase IntlNumberRangeFormatter para formatear un intervalo de dos números con un esqueleto y una configuración regional dados. Está soportada a partir de ICU 63. El comportamiento de colapso es uno de los siguientes:
IntlNumberRangeFormatter::COLLAPSE_AUTOIntlNumberRangeFormatter::COLLAPSE_NONEIntlNumberRangeFormatter::COLLAPSE_UNITIntlNumberRangeFormatter::COLLAPSE_ALLIntlNumberRangeFormatter::IDENTITY_FALLBACK_SINGLE_VALUEIntlNumberRangeFormatter::IDENTITY_FALLBACK_APPROXIMATELY_OR_SINGLE_VALUEIntlNumberRangeFormatter::IDENTITY_FALLBACK_APPROXIMATELYIntlNumberRangeFormatter::IDENTITY_FALLBACK_RANGE
Se ha añadido SpoofChecker::areBidiConfusable() para
comprobar si dos strings son confundibles para una dirección de texto dada,
junto con las constantes de dirección SpoofChecker::LTR
y SpoofChecker::RTL.
Está soportado a partir de ICU 74.
Se ha añadido SpoofChecker::getBidiSkeleton() para generar un esqueleto de confusión para una dirección de texto dada. Está soportado a partir de ICU 74.
Se ha añadido SpoofChecker::getSkeleton() para generar un esqueleto de confusión para un string dado.
Se ha añadido una nueva API de sondeo (polling), compuesta por:
Se ha añadido información adicional sobre la ubicación del error a los mensajes de error devueltos por json_last_error_msg() y al mensaje de JsonException.
Se ha añadido soporte para la reanudación de sesiones TLS en los flujos. Esto permite guardar y restaurar sesiones de cliente entre peticiones, implementar un almacenamiento de sesiones personalizado en el lado del servidor y controlar el comportamiento de la caché de sesiones, mediante las siguientes nuevas opciones de contexto SSL:
session_datasession_new_cbsession_cachesession_cache_sizesession_timeoutsession_id_contextsession_get_cbsession_remove_cbnum_tickets
Se ha añadido soporte para claves precompartidas (PSK)
externas de TLS en los flujos, con las nuevas opciones
de contexto SSL
psk_client_cb y psk_server_cb.
Esto permite definir y recibir claves precompartidas.
Se ha añadido soporte para los datos tempranos (0-RTT) de TLS
1.3 en los flujos.
Los clientes envían datos tempranos con la opción de
contexto SSL
early_data; los servidores los aceptan con
max_early_data y los reciben mediante la función de
retrollamada early_data_cb.
El resultado se indica como "accepted",
"rejected" o "not_sent" en la clave
"early_data" de la entrada "crypto"
del array devuelto por stream_get_meta_data().
Se ha añadido Pdo\Pgsql::ATTR_CHUNK_SIZE, el número de
filas que una sentencia recupera por bloque.
Un valor de 1 o más activa el modo de recuperación diferida de
PDO::ATTR_PREFETCH => 0.
Definir PDO::ATTR_PREFETCH sustituye el tamaño de
bloque.
Las sentencias preparadas sin esta opción ni
PDO::ATTR_PREFETCH recurren al valor definido en la
conexión.
Requiere libpq 17 o posterior.
La sobrescritura de los métodos SplFileInfo::getMTime() y SplFileInfo::getPathname() ahora influye en el resultado de las familias de métodos Phar::buildFromDirectory() y Phar::buildFromIterator(). Esto permite sobrescribir la marca de tiempo y los nombres de los ficheros.
Ahora es posible utilizar AES192,
AES192C, AES256 y
AES256C como protocolos de seguridad SNMPv3 si la
biblioteca subyacente los soporta.
Ahora es posible restablecer el árbol MIB mediante la nueva función snmp_init_mib().
Se ha expuesto una funcionalidad adicional de control del análisis de MIB y de la salida mediante:
Se ha añadido una nueva API de errores de flujo, compuesta por:
error_mode, error_store y
error_handler.
Se ha añadido la opción de contexto de flujo
filter.max_filter_count para las URL
php://filter.
Cuando está definida, la apertura del flujo falla con una advertencia si la
URL añadiera más filtros que el valor configurado.
Los valores negativos desactivan la comprobación.
Se ha añadido la opción de contexto de socket
so_reuseaddr que permite desactivar la reutilización de
direcciones (SO_REUSEADDR) y utiliza explícitamente
SO_EXCLUSIVEADDRUSE en Windows.
Se han añadido las opciones de contexto de socket
so_keepalive, tcp_keepidle,
tcp_keepintvl y tcp_keepcnt que
permiten definir las opciones de keepalive del socket.
Se ha añadido la opción de contexto de socket
so_linger que define SO_LINGER en los
sockets TCP.
Un valor positivo activa la espera de cierre durante ese número de
segundos; cero o un valor negativo la desactiva.
Los valores superiores a 65535 se limitan, ya que en algunas plataformas el
tiempo de linger está limitado a un entero corto sin signo.
Se han añadido las opciones de contexto de socket
so_rcvbuf y so_sndbuf que definen los
tamaños de los búferes de recepción y de envío del socket, en bytes
(SO_RCVBUF y SO_SNDBUF), en los
sockets TCP y UDP.
El valor debe ser un entero entre 1 y 2147483647; cualquier otro valor hace
que falle la creación del flujo.
El sistema operativo puede redondear, limitar o ajustar de otro modo el
tamaño solicitado, y puede dejar de dimensionar ese búfer automáticamente,
por lo que el tamaño leído puede diferir del solicitado.
Los flujos filtrados ahora pueden convertirse en descriptores de fichero para su uso con stream_select().
Se ha añadido el parámetro de filtro "write_seek_mode"
para los filtros de flujo bz2, iconv, zlib y
convert.
Este parámetro debe definirse mediante un array asociativo cuya clave sea
"write_seek_mode" y cuyo valor sea uno de los siguientes
strings:
"preserve""reset""strict"Se han añadido Uri\Rfc3986\Uri::getUriType() y Uri\WhatWg\Url::isSpecialScheme().
Se han añadido Uri\Rfc3986\Uri::getHostType() y Uri\WhatWg\Url::getHostType().
Se han añadido las clases Uri\Rfc3986\UriBuilder y Uri\WhatWg\UrlBuilder.
Se ha añadido Uri\WhatWg\url_percent_encode().