Nouvelles fonctionnalités

PHP Core

Valeurs par défaut pour les propriétés en lecture seule

Les propriétés en lecture seule peuvent désormais déclarer des valeurs par défaut.

<?php
class Config
{
    public readonly int $timeout = 30;
}

$config = new Config();
var_dump($config->timeout); // int(30)

Assignation par référence sur WeakMap

Il est dĂ©sormais possible d'utiliser l'assignation par rĂ©fĂ©rence sur une WeakMap sans que la clĂ© n'ait besoin d'ĂȘtre prĂ©sente au prĂ©alable.

<?php
$obj = new stdClass();
$map = new WeakMap();
$count = 0;

// Auparavant : Error: "Object stdClass#1 not contained in WeakMap"
$map[$obj] = &$count;
$count++;

var_dump($map[$obj]); // int(1)

__debugInfo() sur les énumérations

Il est désormais possible de définir la méthode magique __debugInfo() sur les énumérations. Auparavant, cela provoquait une erreur fatale.

<?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);

L'exemple ci-dessus va afficher :

enum(Suit::Hearts) (2) {
  ["suit"]=>
  string(6) "Hearts"
  ["symbol"]=>
  string(1) "H"
}

#[\Override] pour les constantes de classe

L'attribut Override peut dĂ©sormais ĂȘtre appliquĂ© aux constantes de classe, y compris aux cas d'Ă©numĂ©ration. Comme pour les mĂ©thodes et les propriĂ©tĂ©s, une erreur de compilation est levĂ©e si aucune constante correspondante n'existe dans une classe parente ou une interface implĂ©mentĂ©e.

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

Application partielle de fonction

Ajout du support de l'application partielle de fonction. Un appel dans lequel un ou plusieurs arguments sont remplacés par le marqueur ?, ou les arguments restants par le marqueur ..., crée une Closure qui accepte les arguments manquants.

<?php
function add(int $a, int $b, int $c = 0): int
{
    return $a + $b + $c;
}

// "?" remplace exactement un argument
$addOne = add(1, ?);
var_dump($addOne(5)); // int(6)

// "..." remplace tous les arguments restants
$addToOne = add(1, ...);
var_dump($addToOne(2, 3)); // int(6)

// Fonctionne avec n'importe quel callable, y compris les fonctions internes
$stripSpaces = str_replace(' ', '', ?);
var_dump($stripSpaces('a b c')); // string(3) "abc"

Modification des objets stockés dans des constantes

Les objets stockĂ©s dans des constantes ou des constantes de classe peuvent dĂ©sormais ĂȘtre modifiĂ©s directement via OBJ->prop = $val.

<?php
const CONFIG = new stdClass();

// Auparavant : "Fatal error: Cannot use temporary expression in write context"
CONFIG->debug = true;

var_dump(CONFIG->debug); // bool(true)

Modificateurs d'endianness pour pack() et unpack()

pack() et unpack() acceptent désormais les modificateurs < (little-endian) et > (big-endian) aprÚs les codes de format d'entiers s, S, l, L, q et Q, ainsi qu'aprÚs les codes de format de nombres à virgule flottante f et d.

<?php
echo bin2hex(pack('l>', 1)), PHP_EOL;   // Affiche "00000001"
echo bin2hex(pack('l<', 1)), PHP_EOL;   // Affiche "01000000"
echo bin2hex(pack('f>', 1.5)), PHP_EOL; // Affiche "3fc00000"

var_dump(unpack('s>value', "\xff\xfe")); // ["value" => int(-2)]

cURL

Le tableau retournĂ© par curl_getinfo() inclut dĂ©sormais une nouvelle clĂ© "size_delivered", qui indique le nombre total d'octets transmis Ă  la fonction de rappel d'Ă©criture du tĂ©lĂ©chargement. Cette valeur peut Ă©galement ĂȘtre obtenue en passant CURLINFO_SIZE_DELIVERED comme paramĂštre option. NĂ©cessite libcurl 8.20.0 ou ultĂ©rieur.

Ajout de CURLOPT_SEEKFUNCTION pour enregistrer une fonction de rappel qui repositionne le corps d'une requĂȘte transmis en flux, afin que libcurl puisse le rembobiner et le renvoyer lors d'une redirection, d'une authentification en plusieurs passes ou d'une nouvelle tentative sur une connexion rĂ©utilisĂ©e, au lieu d'Ă©chouer avec CURLE_SEND_FAIL_REWIND. La fonction de rappel reçoit le CurlHandle, le dĂ©calage et l'origine, et doit retourner l'une des valeurs CURL_SEEKFUNC_OK, CURL_SEEKFUNC_FAIL ou CURL_SEEKFUNC_CANTSEEK.

Date

Ajout de la classe Time\Duration.

FileInfo

finfo_file() fonctionne désormais avec les flux distants.

GMP

Ajout de gmp_powm_sec() pour l'exponentiation modulaire résistante aux attaques par canaux auxiliaires. Nécessite GNU MP 5.0.0 ou ultérieur ; indisponible sur les compilations officielles pour Windows utilisant MPIR.

Ajout de gmp_prevprime() pour obtenir le plus grand nombre premier inférieur au nombre donné. Le paramÚtre de sortie optionnel definitely_prime indique si le nombre retourné est certainement premier, par opposition à probablement premier. Une ValueError est levée si un tel nombre premier n'existe pas. Cette fonction n'est disponible que lorsque PHP est compilé avec GNU MP 6.3.0 ou ultérieur ; elle n'est pas disponible sur les compilations officielles pour Windows utilisant MPIR.

Intl

Ajout des méthodes statiques IntlDatePatternGenerator::getSkeleton() et IntlDatePatternGenerator::getBaseSkeleton() pour générer le squelette unique et le squelette de base d'un motif de date/heure.

Ajout de Locale::getDisplayKeyword() et Locale::getDisplayKeywordValue(), avec les alias locale_get_display_keyword() et locale_get_display_keyword_value(), respectivement.

Ajout de la classe IntlNumberRangeFormatter pour formater un intervalle de deux nombres avec un squelette et une locale donnés. Elle est prise en charge à partir de ICU 63. Le comportement de regroupement est l'un des suivants :

  • IntlNumberRangeFormatter::COLLAPSE_AUTO
  • IntlNumberRangeFormatter::COLLAPSE_NONE
  • IntlNumberRangeFormatter::COLLAPSE_UNIT
  • IntlNumberRangeFormatter::COLLAPSE_ALL
Le comportement de repli en cas d'identité est l'un des suivants :
  • IntlNumberRangeFormatter::IDENTITY_FALLBACK_SINGLE_VALUE
  • IntlNumberRangeFormatter::IDENTITY_FALLBACK_APPROXIMATELY_OR_SINGLE_VALUE
  • IntlNumberRangeFormatter::IDENTITY_FALLBACK_APPROXIMATELY
  • IntlNumberRangeFormatter::IDENTITY_FALLBACK_RANGE

Ajout de SpoofChecker::areBidiConfusable() pour vérifier si deux chaßnes sont confondables pour une direction de texte donnée, ainsi que des constantes de direction SpoofChecker::LTR et SpoofChecker::RTL. Elle est prise en charge à partir de ICU 74.

Ajout de SpoofChecker::getBidiSkeleton() pour générer un squelette de confusion pour une direction de texte donnée. Elle est prise en charge à partir de ICU 74.

Ajout de SpoofChecker::getSkeleton() pour générer un squelette de confusion pour une chaßne donnée.

IO

Ajout d'une nouvelle API de scrutation (polling), composée de :

  • Les classes Io\Poll\Context et Io\Poll\Watcher
  • Les Ă©numĂ©rations Io\Poll\Backend et Io\Poll\Event
  • L'interface Io\Poll\Handle
  • La classe StreamPollHandle pour surveiller les flux

JSON

Ajout d'informations supplémentaires sur l'emplacement de l'erreur dans les messages d'erreur retournés par json_last_error_msg() et dans le message de JsonException.

OpenSSL

Ajout du support de la reprise de session TLS pour les flux. Cela permet de sauvegarder et de restaurer des sessions client entre les requĂȘtes, d'implĂ©menter un stockage de session personnalisĂ© cĂŽtĂ© serveur et de contrĂŽler le comportement du cache de sessions, Ă  l'aide des nouvelles options de contexte SSL suivantes :

  • session_data
  • session_new_cb
  • session_cache
  • session_cache_size
  • session_timeout
  • session_id_context
  • session_get_cb
  • session_remove_cb
  • num_tickets

Ajout du support des clés pré-partagées (PSK) externes TLS pour les flux, avec les nouvelles options de contexte SSL psk_client_cb et psk_server_cb. Cela permet de définir et de recevoir des clés pré-partagées.

Ajout du support des données anticipées (0-RTT) de TLS 1.3 pour les flux. Les clients envoient des données anticipées avec l'option de contexte SSL early_data ; les serveurs les acceptent avec max_early_data et les reçoivent via la fonction de rappel early_data_cb. Le résultat est indiqué par "accepted", "rejected" ou "not_sent" dans la clé "early_data" de l'entrée "crypto" du tableau retourné par stream_get_meta_data().

PDO_PGSQL

Ajout de Pdo\Pgsql::ATTR_CHUNK_SIZE, le nombre de lignes qu'une requĂȘte rĂ©cupĂšre par bloc. Une valeur de 1 ou plus active le mode de rĂ©cupĂ©ration paresseuse de PDO::ATTR_PREFETCH => 0. DĂ©finir PDO::ATTR_PREFETCH remplace la taille de bloc. Les requĂȘtes prĂ©parĂ©es sans cette option ni PDO::ATTR_PREFETCH reprennent la valeur dĂ©finie sur la connexion. NĂ©cessite libpq 17 ou ultĂ©rieur.

Phar

La surcharge des méthodes SplFileInfo::getMTime() et SplFileInfo::getPathname() influence désormais le résultat des familles de méthodes Phar::buildFromDirectory() et Phar::buildFromIterator(). Cela permet de redéfinir l'horodatage et les noms des fichiers.

SNMP

Il est désormais possible d'utiliser AES192, AES192C, AES256 et AES256C comme protocoles de sécurité SNMPv3 si la bibliothÚque sous-jacente les prend en charge.

Il est désormais possible de réinitialiser l'arbre MIB avec la nouvelle fonction snmp_init_mib().

Des fonctionnalités supplémentaires de contrÎle de l'analyse des MIB et de la sortie sont exposées via :

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

Flux

Ajout d'une nouvelle API d'erreurs de flux, composée de :

  • Les classes StreamError et StreamException
  • Les Ă©numĂ©rations StreamErrorStore, StreamErrorMode et StreamErrorCode
  • Les fonctions stream_last_errors() et stream_clear_errors()
Elle est contrÎlée à l'aide des options de contexte de flux error_mode, error_store et error_handler.

Ajout de l'option de contexte de flux filter.max_filter_count pour les URL php://filter. Lorsqu'elle est définie, l'ouverture du flux échoue avec un avertissement si l'URL ajoutait plus de filtres que la valeur configurée. Les valeurs négatives désactivent la vérification.

Ajout de l'option de contexte de socket so_reuseaddr qui permet de désactiver la réutilisation d'adresse (SO_REUSEADDR) et utilise explicitement SO_EXCLUSIVEADDRUSE sous Windows.

Ajout des options de contexte de socket so_keepalive, tcp_keepidle, tcp_keepintvl et tcp_keepcnt qui permettent de définir les options de keepalive des sockets.

Ajout de l'option de contexte de socket so_linger qui définit SO_LINGER sur les sockets TCP. Une valeur positive active l'attente de fermeture pendant ce nombre de secondes, zéro ou une valeur négative la désactive. Les valeurs supérieures à 65535 sont plafonnées, car sur certaines plateformes la durée de linger est limitée à un entier court non signé.

Ajout des options de contexte de socket so_rcvbuf et so_sndbuf qui dĂ©finissent les tailles des tampons de rĂ©ception et d'envoi du socket, en octets (SO_RCVBUF et SO_SNDBUF), sur les sockets TCP et UDP. La valeur doit ĂȘtre un entier compris entre 1 et 2147483647 ; toute autre valeur fait Ă©chouer la crĂ©ation du flux. Le systĂšme d'exploitation peut arrondir, plafonner ou ajuster autrement la taille demandĂ©e, et peut cesser de dimensionner ce tampon automatiquement ; la taille relue peut donc diffĂ©rer de celle demandĂ©e.

Les flux filtrĂ©s peuvent dĂ©sormais ĂȘtre convertis en descripteurs de fichier, pour une utilisation avec stream_select().

Ajout du paramĂštre de filtre "write_seek_mode" pour les filtres de flux bz2, iconv, zlib et convert. Ce paramĂštre doit ĂȘtre dĂ©fini via un tableau associatif dont la clĂ© est "write_seek_mode" et dont la valeur est l'une des chaĂźnes suivantes :

  • "preserve"
  • "reset"
  • "strict"

URI

Ajout de Uri\Rfc3986\Uri::getUriType() et Uri\WhatWg\Url::isSpecialScheme().

Ajout de Uri\Rfc3986\Uri::getHostType() et Uri\WhatWg\Url::getHostType().

Ajout des classes Uri\Rfc3986\UriBuilder et Uri\WhatWg\UrlBuilder.

Ajout de Uri\WhatWg\url_percent_encode().

add a note

User Contributed Notes

There are no user contributed notes for this page.