Nuevas características

PHP Core

Valores por defecto para las propiedades readonly

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)

Asignación por referencia en WeakMap

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)

__debugInfo() en las enumeraciones

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 clase

El 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';
}

Aplicación parcial de funciones

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"

Modificación de objetos almacenados en constantes

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)

Modificadores de endianness para pack() y unpack()

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)]

cURL

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.

Date

Se ha añadido la clase Time\Duration.

FileInfo

finfo_file() ahora funciona con flujos remotos.

GMP

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.

Intl

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_AUTO
  • IntlNumberRangeFormatter::COLLAPSE_NONE
  • IntlNumberRangeFormatter::COLLAPSE_UNIT
  • IntlNumberRangeFormatter::COLLAPSE_ALL
El comportamiento de reserva por identidad es uno de los siguientes:
  • IntlNumberRangeFormatter::IDENTITY_FALLBACK_SINGLE_VALUE
  • IntlNumberRangeFormatter::IDENTITY_FALLBACK_APPROXIMATELY_OR_SINGLE_VALUE
  • IntlNumberRangeFormatter::IDENTITY_FALLBACK_APPROXIMATELY
  • IntlNumberRangeFormatter::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.

IO

Se ha añadido una nueva API de sondeo (polling), compuesta por:

  • Las clases Io\Poll\Context y Io\Poll\Watcher
  • Las enumeraciones Io\Poll\Backend y Io\Poll\Event
  • La interfaz Io\Poll\Handle
  • La clase StreamPollHandle para vigilar flujos

JSON

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.

OpenSSL

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_data
  • session_new_cb
  • session_cache
  • session_cache_size
  • session_timeout
  • session_id_context
  • session_get_cb
  • session_remove_cb
  • num_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().

PDO_PGSQL

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.

Phar

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.

SNMP

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:

  • snmp_set_mib_option()
  • snmp_set_output_option()
  • snmp_set_string_output_format()
  • SNMP::$numeric_index
  • SNMP::$numeric_timeticks
  • SNMP::$extended_index
  • SNMP::$dont_print_units
  • SNMP::$escape_quotes
  • SNMP::$print_hex_text
  • SNMP::setOidOutputFormat()
  • SNMP::setStringOutputFormat()

Flujos

Se ha añadido una nueva API de errores de flujo, compuesta por:

  • Las clases StreamError y StreamException
  • Las enumeraciones StreamErrorStore, StreamErrorMode y StreamErrorCode
  • Las funciones stream_last_errors() y stream_clear_errors()
Se controla mediante las opciones de contexto de flujo 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"

URI

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().

+add a note

User Contributed Notes

There are no user contributed notes for this page.