Le support des arguments nommés a été ajouté.
Le support des Attributs a été ajouté.
Le support pour la promotion de propriété de constructeur (déclarer les propriété dans la signature du constructeur) a été ajouté.
Le support pour les types d'unions a été ajouté.
Le support pour l'expression match
a été ajouté.
Le support pour l'opérateur nullsafe (?->
) a été ajouté.
La classe WeakMap a été ajoutée.
La classe ValueError a été ajoutée.
N'importe quel nombre de paramètres de fonction peut maintenant être remplacé par un argument variadique, tant que les types sont compatibles. Par exemple, le code suivant est maintenant autorisé :
<?php
class A {
public function method(int $many, string $parameters, $here) {}
}
class B extends A {
public function method(...$everything) {}
}
?>
static (comme dans la "résolution statique à la volée") peut maintenant être utilisé comme type de retour :
<?php
class Test {
public function create(): static {
return new static();
}
}
?>
Il est maintenant possible de récupérer le nom de la classe d'un objet en utilisant
$object::class
. Le résultat est le même que get_class($object)
.
new
et instanceof
peuvent maintenant être utilisés avec des expressions arbitraires,
par exemple new (expression)(...$args)
et $obj instanceof (expression)
.
Quelques corrections de syntaxe de variables ont été appliquées, par exemple écrire
Foo::BAR::$baz
est maintenant autorisé.
Ajout de l'interface Stringable, qui est automatiquement implémentée si une classe définie une méthode __toString().
Les traits peuvent maintenant définir des méthodes privées abstraites. Ces méthodes doivent être implémentées par la classe utilisant le trait.
throw
peut maintenant être utilisé comme expression.
Cela permet des usages comme :
<?php
$fn = fn() => throw new Exception('Exception dans une fonction fléchée');
$user = $session->user ?? throw new Exception('Un utilisateur est requis');
Une virguile finale optionnelle est maintenant autorisée dans les listes de paramètres.
<?php
function functionWithLongSignature(
Type1 $parameter1,
Type2 $parameter2, // <-- This comma is now allowed.
) {
}
Il est maintenant possible d'écrire catch (Exception)
pour attraper une exception sans la stocker
dans une variable.
Le support pour le type mixed a été ajouté.
Les méthodes privées déclarées dans une classe parente n'imposent plus de règles d'héritage sur les méthodes de la classe enfante (à l'exception des constructeurs privés finaux). L'exemple suivant illustre les restrictions qui ont été supprimées :
<?php
class ParentClass {
private function method1() {}
private function method2() {}
private static function method3() {}
// Lance un avertissement, car "final" n'a plus d'effet :
private final function method4() {}
}
class ChildClass extends ParentClass {
// Tous les exemples suivants sont maintenant autorisés, même si les modificateurs ne sont pas
// les même que pour les méthods privés dans la classe parente.
public abstract function method1() {}
public static function method2() {}
public function method3() {}
public function method4() {}
}
?>
get_resource_id() a été ajouté, qui retourne la même valeur que
(int) $resource
. Il fournit la même fonctionnalité sous une API plus claire.
InternalIterator a été ajouté.
DateTime::createFromInterface() et DateTimeImmutable::createFromInterface() ont été ajoutés.
Le formatteur de date et heure p
a été ajouté, qui est le même que
P
mais retourne Z
plutôt que +00:00
pour UTC.
DOMParentNode et DOMChildNode avec de nouvelles API de traversée et de manipulation ont été ajoutées.
FILTER_VALIDATE_BOOL
a été ajouté en tant qu'alias de
FILTER_VALIDATE_BOOLEAN
. Le nouveau nom est préféré, car il se base sur le
nom du type.
enchant_dict_add(), enchant_dict_is_added(), et
LIBENCHANT_VERSION
ont été ajoutés.
Ajout d'une nouvelle option pm.status_listen
qui permet d'obtenir le statut
depuis un point final différent (par exemple, un port ou un fichier UDS) ce qui est utile pour obtenir le statut lorsque
tous les enfants sont occupés à servir des requêtes longues.
Les objets HashContext peuvent maintenant être sérialisés.
Les constantes IntlDateFormatter::RELATIVE_FULL
,
IntlDateFormatter::RELATIVE_LONG
,
IntlDateFormatter::RELATIVE_MEDIUM
, et
IntlDateFormatter::RELATIVE_SHORT
ont été ajoutées.
ldap_count_references() a été ajouté, qui retourne le nombre de messages de référence dans un résultat de recherche.
Si le paramètre de configuration opcache.record_warnings est activé, OPcache enregistrera les avertissements de compilation et les rejouera lors de la prochaine inclusion, même si elle est servie depuis le cache.
Ajout du support de la Syntaxe de Message Cryptographique (Cryptographic Message Syntax ou CMS) (» RFC 5652)
composé de fonctions pour le chiffrement, le déchiffrement, la signature, la vérification et la lecture. L'API
est similaire à l'API des fonctions PKCS #7 avec l'ajout de nouvelles constantes d'encodage :
OPENSSL_ENCODING_DER
, OPENSSL_ENCODING_SMIME
et OPENSSL_ENCODING_PEM
:
preg_last_error_msg() a été ajouté, qui retourne un message lisible par l'homme pour la dernière erreur PCRE. Il complète preg_last_error(), qui retourne une valeur d'énumération entière à la place.
Les méthodes suivantes peuvent maintenant retourner des informations sur les valeurs par défaut des paramètres des fonctions internes :
SQLite3::setAuthorizer() et les constantes de classe respectives ont été ajoutées pour définir un rappel utilisateur qui sera utilisé pour autoriser ou non une action sur la base de données.
str_contains(), str_starts_with() et
str_ends_with() ont été ajoutés, elles vérifient si haystack
contient,
commence par ou fini par needle
, respectivement.
fdiv() a été ajouté, qui éffectue une division en virgule flottante sous les sémantiques IEEE 754.
La division par zéro est considérée comme bien définie et retournera l'une des valeurs Inf
,
-Inf
ou NaN
.
get_debug_type() a été ajouté, qui retourne un type utile pour les messages d'erreur. Contrairement à gettype(), il utilise des noms de type canoniques, retourne les noms de classe pour les objets, et indique le type de ressource pour les ressources.
printf() et ses amis supportent maintenant les spécificateurs de format %h
et
%H
. Ils sont les mêmes que %g
et
%G
, mais utilisent toujours "."
comme séparateur décimal, plutôt
que de le déterminer via la locale LC_NUMERIC
.
printf() et ses amis supportent maintenant l'utilisation de "*"
comme largeur ou
précision, auquel cas la largeur/précision est passée comme argument à printf. Cela permet également
d'utiliser une précision -1
avec %g
, %G
,
%h
et %H
. Par exemple, le code suivant peut être utilisé pour
reproduire le formatage par défaut des nombres à virgule flottante de PHP :
<?php
printf("%.*H", (int) ini_get("precision"), $float);
printf("%.*H", (int) ini_get("serialize_precision"), $float);
?>
proc_open() support maintent les descripteurs de pseudo-terminal (PTY). Le code suivant
attache stdin
, stdout
et stderr
au
même PTY:
<?php
$proc = proc_open($command, [['pty'], ['pty'], ['pty']], $pipes);
?>
proc_open() supportent maintenant les descripteurs de paire de socket. Le code suivant attache
distinct socket paire to stdin
, stdout
and
stderr
:
<?php
$proc = proc_open($command, [['socket'], ['socket'], ['socket']], $pipes);
?>
Contrairement aux pipes, les sockets ne souffrent pas de problèmes de blocage d'E/S sur Windows. Cependant, tous les programmes peuvent ne pas fonctionner correctement avec les sockets stdio.
Les fonctions de tri sont maintenant stables, ce qui signifie que les éléments comparés égaux conserveront leur ordre d'origine.
array_diff(), array_intersect() et leurs variations peuvent maintenant être utilisées avec un seul tableau comme argument. Cela signifie que des utilisations comme les suivantes sont maintenant possibles :
<?php
// OK même si $excludes est vide:
array_diff($array, ...$excludes);
// OK même si $arrays contient un seul tableau:
array_intersect(...$arrays);
?>
Le paramètre drapeau
de ob_implicit_flush() a été modifié
pour accepter un bool plutôt qu'un int.
PhpToken ajoute une interface basée sur les objets au tokenizer. Il fournit une repésentation plus uniforme et ergonomique, tout en étant plus efficace en mémoire et plus rapide.
L'extension Zip a été mis à jour en version 1.19.1.
Nouveaux ZipArchive::setMtimeName() et ZipArchive::setMtimeIndex() pour changer le temps de modification d'une entrée.
Nouveau ZipArchive::registerProgressCallback() pour fournir des mises à jour pendant la fermeture de l'archive.
Nouveau ZipArchive::registerCancelCallback() pour autoriser l'annulation pendant la fermeture de l'archive.
Nouveau ZipArchive::replaceFile() pour remplacer une entrée courante.
Nouveau ZipArchive::isCompressionMethodSupported() pour vérifier les fonctionnalités de compression optionnelles.
Nouveau ZipArchive::isEncryptionMethodSupported() pour vérifier les fonctionnalités de chiffrement optionnelles.
La propriété ZipArchive::lastId pour avoir la valuer de l'index de la dernière entrée ajoutée a été ajoutée.
Les erreurs peuvent maintenant être vérifiées après la fermeture d'une archive en utilisant les propriétés ZipArchive::status et ZipArchive::statusSys, ou la méthode ZipArchive::getStatusString().
L'option 'remove_path'
de ZipArchive::addGlob() et
ZipArchive::addPattern() est maintenant traitée comme un préfixe de chaîne arbitraire (pour
la cohérence avec l'option 'add_path'
), alors qu'auparavant elle était traitée comme un
nom de répertoire.
Les fonctionnalités de compression / chiffrement sont maintenant listées dans phpinfo.