Se ha añadido soporte para losArgumentos nombrados.
Se ha añadido soporte para los Atributos.
Se ha añadido soporte para la promoción de propiedades en el constructor (declarar propiedades en la firma del constructor).
Se ha añadido soporte para los tipos de unión.
Se ha añadido soporte para las expresiones match.
Se ha añadido soporte para el operador nullsafe (?->).
Se ha añadido la clase WeakMap.
Se ha añadido la clase ValueError.
Cualquier número de parámetros de función ahora puede ser reemplazado por un argumento variádico, siempre que los tipos sean compatibles. Por ejemplo, el siguiente código ahora está permitido:
<?php
class A {
public function method(int $many, string $parameters, $here) {}
}
class B extends A {
public function method(...$everything) {}
}
?>static (como en "enlace estático en tiempo de ejecución") ahora puede ser usado como tipo de retorno:
<?php
class Test {
public function create(): static {
return new static();
}
}
?>
Ahora es posible obtener el nombre de la clase de un objeto usando
$object::class. El resultado es el mismo que get_class($object).
new e instanceof ahora pueden ser usados con expresiones arbitrarias,
usando new (expression)(...$args) y $obj instanceof (expression).
Se han aplicado algunas correcciones de consistencia en la sintaxis de variables, por ejemplo, escribir
Foo::BAR::$baz ahora está permitido.
Se ha añadido la interfaz Stringable, que se implementa automáticamente si una clase define un método __toString().
Los traits ahora pueden definir métodos privados abstractos. Dichos métodos deben ser implementados por la clase que usa el trait.
throw ahora puede ser usado como una expresión.
Esto permite usos como:
<?php
$fn = fn() => throw new Exception('Exception in arrow function');
$user = $session->user ?? throw new Exception('Must have user');Ahora se permite una coma final opcional en las listas de parámetros.
<?php
function functionWithLongSignature(
Type1 $parameter1,
Type2 $parameter2, // <-- This comma is now allowed.
) {
}
Ahora es posible escribir catch (Exception) para capturar una excepción sin almacenarla
en una variable.
Se ha añadido soporte para el tipo mixed.
Los métodos privados declarados en una clase padre ya no imponen ninguna regla de herencia sobre los métodos de una clase hija (con la excepción de los constructores privados finales). El siguiente ejemplo ilustra qué restricciones han sido eliminadas:
<?php
class ParentClass {
private function method1() {}
private function method2() {}
private static function method3() {}
// Throws a warning, as "final" no longer has an effect:
private final function method4() {}
}
class ChildClass extends ParentClass {
// All of the following are now allowed, even though the modifiers aren't
// the same as for the private methods in the parent class.
public abstract function method1() {}
public static function method2() {}
public function method3() {}
public function method4() {}
}
?>
Se ha añadido get_resource_id(), que devuelve el mismo valor que
(int) $resource. Proporciona la misma funcionalidad con una API más clara.
Se han añadido DateTime::createFromInterface() y DateTimeImmutable::createFromInterface().
Se ha añadido el especificador de formato DateTime p, que es igual que
P pero devuelve Z en lugar de +00:00
para UTC.
Se han añadido DOMParentNode y DOMChildNode con nuevas API de recorrido y manipulación.
Se ha añadido FILTER_VALIDATE_BOOL como alias de
FILTER_VALIDATE_BOOLEAN. Se prefiere el nuevo nombre, ya que utiliza el nombre
de tipo canónico.
Se han añadido enchant_dict_add(), enchant_dict_is_added() y
LIBENCHANT_VERSION.
Se ha añadido una nueva opción pm.status_listen que permite obtener el estado desde
un endpoint diferente (por ejemplo, un puerto o archivo UDS), lo cual es útil para obtener el estado cuando todos
los procesos hijos están ocupados sirviendo peticiones de larga duración.
Los objetos HashContext ahora pueden ser serializados.
Se han añadido las constantes IntlDateFormatter::RELATIVE_FULL,
IntlDateFormatter::RELATIVE_LONG,
IntlDateFormatter::RELATIVE_MEDIUM y
IntlDateFormatter::RELATIVE_SHORT.
Se ha añadido ldap_count_references(), que devuelve el número de mensajes de referencia en un resultado de búsqueda.
Si la directiva ini opcache.record_warnings está habilitada, OPcache registrará las advertencias en tiempo de compilación y las reproducirá en el siguiente include, incluso si se sirve desde la caché.
Se ha añadido soporte para Cryptographic Message Syntax (CMS) (» RFC 5652)
compuesto por funciones para cifrado, descifrado, firma, verificación y lectura. La API
es similar a la API de las funciones PKCS #7 con la adición de nuevas constantes de codificación:
OPENSSL_ENCODING_DER, OPENSSL_ENCODING_SMIME
y OPENSSL_ENCODING_PEM:
Se ha añadido preg_last_error_msg(), que devuelve un mensaje legible para el último error PCRE. Complementa a preg_last_error(), que devuelve un valor entero de enumeración en su lugar.
Los siguientes métodos ahora pueden devolver información sobre los valores predeterminados de los parámetros de las funciones internas:
Se han añadido SQLite3::setAuthorizer() y las constantes de clase correspondientes para establecer una función de retorno de llamada de usuario que se utilizará para autorizar o no una acción en la base de datos.
Se han añadido str_contains(), str_starts_with() y
str_ends_with(), que comprueban si haystack contiene,
comienza con o termina con needle, respectivamente.
Se ha añadido fdiv(), que realiza una división de punto flotante según la semántica IEEE 754.
La división por cero se considera bien definida y devolverá uno de Inf,
-Inf o NaN.
Se ha añadido get_debug_type(), que devuelve un tipo útil para mensajes de error. A diferencia de gettype(), utiliza nombres de tipo canónicos, devuelve nombres de clase para objetos e indica el tipo de recurso para los recursos.
printf() y funciones similares ahora soportan los especificadores de formato %h y
%H. Son iguales que %g y
%G, pero siempre usan "." como separador decimal, en lugar
de determinarlo a través de la configuración regional LC_NUMERIC.
printf() y funciones similares ahora soportan el uso de "*" como ancho o
precisión, en cuyo caso el ancho/precisión se pasa como argumento a printf. Esto también permite
usar precisión -1 con %g, %G,
%h y %H. Por ejemplo, el siguiente código puede usarse para
reproducir el formato predeterminado de punto flotante de PHP:
<?php
printf("%.*H", (int) ini_get("precision"), $float);
printf("%.*H", (int) ini_get("serialize_precision"), $float);
?>
proc_open() ahora soporta descriptores de pseudo-terminal (PTY). Lo siguiente
conecta stdin, stdout y stderr al
mismo PTY:
<?php
$proc = proc_open($command, [['pty'], ['pty'], ['pty']], $pipes);
?>
proc_open() ahora soporta descriptores de pares de sockets. Lo siguiente conecta un
par de sockets distinto a stdin, stdout y
stderr:
<?php
$proc = proc_open($command, [['socket'], ['socket'], ['socket']], $pipes);
?>A diferencia de las tuberías, los sockets no sufren problemas de E/S bloqueante en Windows. Sin embargo, no todos los programas pueden funcionar correctamente con sockets stdio.
Las funciones de ordenamiento ahora son estables, lo que significa que los elementos que se comparan como iguales conservarán su orden original.
array_diff(), array_intersect() y sus variaciones ahora pueden ser usadas con un solo array como argumento. Esto significa que usos como los siguientes ahora son posibles:
<?php
// OK even if $excludes is empty:
array_diff($array, ...$excludes);
// OK even if $arrays only contains a single array:
array_intersect(...$arrays);
?>
El parámetro flag de ob_implicit_flush() fue cambiado
para aceptar un bool en lugar de un int.
PhpToken añade una interfaz basada en objetos al tokenizer. Proporciona una representación más uniforme y ergonómica, siendo al mismo tiempo más eficiente en memoria y más rápida.
La extensión Zip ha sido actualizada a la versión 1.19.1.
Nuevos ZipArchive::setMtimeName() y ZipArchive::setMtimeIndex() para establecer la hora de modificación de una entrada.
Nuevo ZipArchive::registerProgressCallback() para proporcionar actualizaciones durante el cierre del archivo.
Nuevo ZipArchive::registerCancelCallback() para permitir la cancelación durante el cierre del archivo.
Nuevo ZipArchive::replaceFile() para reemplazar el contenido de una entrada.
Nuevo ZipArchive::isCompressionMethodSupported() para verificar las características opcionales de compresión.
Nuevo ZipArchive::isEncryptionMethodSupported() para verificar las características opcionales de cifrado.
Se ha añadido la propiedad ZipArchive::lastId para obtener el valor del índice de la última entrada añadida.
Ahora se pueden verificar los errores después de que un archivo ha sido cerrado usando las propiedades ZipArchive::status y ZipArchive::statusSys, o el método ZipArchive::getStatusString().
La opción 'remove_path' de ZipArchive::addGlob() y
ZipArchive::addPattern() ahora se trata como un prefijo de cadena arbitrario (para
mantener la consistencia con la opción 'add_path'), mientras que anteriormente se trataba como un
nombre de directorio.
Las características opcionales de compresión / cifrado ahora se listan en phpinfo.