PHP 8.1 est actuellement en développement actif et sortira le 25 novembre 2021 . Gardez à l’esprit que cette date peut encore changer par l’équipe principale, par exemple, si elle ajoute une version bêta supplémentaire. Nous connaissons déjà les nouvelles fonctionnalités, les améliorations de performances, les modifications et les dépréciations ; alors parcourons-les un par un.
Je viens de lancer une newsletter contextuelle de 10 jours intitulée The Road to PHP 8.1 . Pendant les 10 prochains jours, vous recevrez un e-mail couvrant une nouvelle fonctionnalité existante de PHP 8.1 ; par la suite, vous serez automatiquement désabonné, donc pas de spam ni de suivi. Abonnez-vous maintenant!
#Nouvelles fonctionnalités
Comme pour chaque version, PHP 8.1 ajoute quelques nouvelles fonctionnalités intéressantes. Gardez à l’esprit que cette liste s’allongera au cours de l’année.
#Énumérations rfc
Les énumérations seront ajoutées en PHP 8.1 ! Si vous ne savez pas à quoi ils peuvent servir, vous pouvez en savoir plus ici .
L’ajout d’énumérations serait une amélioration significative de PHP, donc je suis très impatient de voir les énumérations arriver dans PHP 8.1. Pour vous donner un aperçu rapide de ce à quoi ils ressembleront, voici un exemple de code :
enum Status {
case Pending;
case Active;
case Archived;
}
Et voici comment ils seront utilisés :
class Post
{
public function __construct(
private Status $status = Status::Pending;
) {}
public function setStatus(Status $status): void
{
// …
}
}
$post->setStatus(Status::Active);
Vous pouvez trouver une analyse approfondie de l’utilisation des énumérations dans cet article .
#Fibres rfc
Les fibres – alias “fils verts” – sont un mécanisme de bas niveau pour gérer le parallélisme. Vous ne les utiliserez probablement pas directement dans vos applications, mais des frameworks comme Amphp et ReactPHP les utiliseront largement.
Voici un exemple simple d’utilisation de fibres :
$fiber = new Fiber(function (): void {
$valueAfterResuming = Fiber::suspend('after suspending');
// …
});
$valueAfterSuspending = $fiber->start();
$fiber->resume('after resuming');
Si vous voulez en savoir plus sur les fibres, ce qu’elles peuvent et ne peuvent pas faire, vous pouvez lire cet article .
#Amélioration des performances rp
Dmitry Stogov a ajouté quelques améliorations à opcache, il l’appelle « heritage cache ». Cette fonctionnalité permet de mettre en cache les liens entre les classes, tout comme les classes liées peuvent être préchargées à partir de PHP 7.4.
Dmitry rapporte entre 5% et 8% d’augmentation des performances grâce à ce changement, un petit détail sympa à surveiller dans PHP 8.1.
#Déballage du tableau avec des clés de chaîne rfc
Le déballage des tableaux était déjà autorisé dans PHP 7.4 , mais il ne fonctionnait qu’avec des touches numériques. La raison pour laquelle les clés de chaîne n’étaient pas prises en charge auparavant est qu’il n’y avait pas de consensus sur la façon de fusionner les doublons de tableau. La RFC résout clairement ce problème en suivant la sémantique dearray_merge
:
$array1 = ["a" => 1];
$array2 = ["b" => 2];
$array = ["a" => 0, ...$array1, ...$array2];
var_dump($array); // ["a" => 1, "b" => 2]
#new
dans les initialiseurs rfc
Cette RFC vous permet d’utiliser le new
mot – clé dans les définitions de fonction comme paramètre par défaut, ainsi que dans les arguments d’attribut et à d’autres endroits.
class MyController {
public function __construct(
private Logger $logger = new NullLogger(),
) {}
}
Notez que ce RFC est toujours en cours de vote, mais il est déjà clair qu’il passera.
#Propriétés en lecture seule rfc
Les propriétés de classe peuvent être marquées en lecture seule, ce qui signifie qu’elles ne peuvent être écrites qu’une seule fois.
class PostData {
public function __construct(
public readonly string $title,
public readonly DateTimeImmutable $date,
) {}
}
Essayer de modifier une propriété en lecture seule après son initialisation entraînera une erreur :
$post = new Post('Title', /* … */);
$post->title = 'Other';
Error: Cannot modify readonly property Post::$title
Si vous souhaitez en savoir plus sur les propriétés en lecture seule en profondeur, vous pouvez lire mon article de suivi .
Notez que ce RFC est toujours en cours de vote, mais il est déjà clair qu’il passera.
#Syntaxe appelable de première classe rfc
Vous pouvez maintenant faire une fermeture à partir d’un callable en appelant ce callable et en le passant ...
comme argument :
function foo(int $a, int $b) { /* … */ }
$foo = foo(...);
$foo(a: 1, b: 2);
Notez que ce RFC est toujours en cours de vote, mais il est déjà clair qu’il passera.
#Types d’intersection purs rfc
Vous connaissez déjà les types d’union dans PHP 8.0 et les types d’intersection sont une fonctionnalité similaire. Là où les types d’union nécessitent que l’entrée soit l’un des types donnés, les types d’intersection nécessitent que l’entrée soit de tous les types spécifiés. Les types d’intersection sont particulièrement utiles lorsque vous travaillez avec de nombreuses interfaces :
function generateSlug(HasTitle&HasId $post) {
return strtolower($post->getTitle()) . $post->getId();
}
Si vous aimez ce style de programmation, vous devrez créer une nouvelle interface Sluggable
et l’implémenter dans $post
, les types d’intersection se débarrassent de cette surcharge.
#Nouveau never
typerfc
Le never
type peut être utilisé pour indiquer qu’une fonction arrêtera réellement le déroulement du programme. Cela peut être fait en lançant une exception, en appelant exit
ou en d’autres fonctions similaires.
function dd(mixed $input): never
{
// dump
exit;
}
never
diffère de void
ce void
qui permet toujours au programme de continuer. Cela peut sembler une nouveauté, mais c’est en fait une fonctionnalité très utile pour les analyseurs statiques.
#Nouvelle array_is_list
fonctionrfc
Vous avez probablement dû faire face à cela de temps en temps : déterminer si les clés d’un tableau sont dans l’ordre numérique, à partir de l’index 0. Tout comme json_encode
décide si un tableau doit être encodé en tant que tableau ou objet.
PHP 8.1 ajoute une fonction intégrée pour déterminer si un tableau est une liste avec cette sémantique ou non :
$list = ["a", "b", "c"];
array_is_list($list); // true
$notAList = [1 => "a", 2 => "b", 3 => "c"];
array_is_list($notAList); // false
$alsoNotAList = ["a" => "a", "b" => "b", "c" => "c"];
array_is_list($alsoNotAList); // false
#Constantes de classe finale rfc
Les constantes de classe en PHP peuvent être remplacées lors de l’héritage :
class Foo
{
public const X = "foo";
}
class Bar extends Foo
{
public const X = "bar";
}
Depuis PHP 8.1, vous pouvez marquer ces constantes comme final
afin d’éviter cela :
class Foo
{
final public const X = "foo";
}
class Bar extends Foo
{
public const X = "bar";
Fatal error: Bar::X cannot override final constant Foo::X
}
#Nouvelle fsync
fonctionrfc
PHP 8.1 ajoute les fonctions fsync
et fdatasync
pour forcer la synchronisation des modifications de fichiers sur le disque et s’assurer que les tampons d’écriture du système d’exploitation ont été vidés avant de revenir.
$file = fopen("sample.txt", "w");
fwrite($file, "Some content");
if (fsync($file)) {
echo "File has been successfully persisted to disk.";
}
fclose($file);
Étant donné que la synchronisation de disque est une opération de système de fichiers, la fsync
fonction ne fonctionnera que sur des flux de fichiers simples. Tenter de synchroniser des flux non-fichiers émettra un avertissement.
#Notation littérale d’entier octal explicite rfc
Vous pouvez maintenant utiliser 0o
et 0O
pour désigner les nombres octaux. La notation précédente en préfixant un nombre avec 0
fonctionne toujours aussi.
016 === 0o16; // true
016 === 0O16; // true
#Changements marquants
Bien que PHP 8.1 soit une version mineure, il y aura quelques changements qui pourraient techniquement être un changement de rupture, ainsi que des dépréciations. Discutons-en un par un.
#Restreindre l’ $GLOBALS
utilisationrfc
Un petit changement dans la façon dont $GLOBALS
est utilisé aura un impact significatif sur les performances de toutes les opérations de la baie. Nikita fait un excellent travail en expliquant le problème et la solution dans le RFC . Le changement signifie que certains cas limites ne sont plus possibles avec $GLOBALS
. ” Ce qui n’est plus supporté, ce sont les écritures dans $GLOBALS prises dans leur ensemble. Tout ce qui suit va générer une erreur de compilation ” :
$GLOBALS = [];
$GLOBALS += [];
$GLOBALS =& $x;
$x =& $GLOBALS;
unset($GLOBALS);
En plus de cela, le passage $GLOBALS
par référence générera une erreur d’exécution :
by_ref($GLOBALS); // Run-time error
Nikita a analysé les 2000 meilleurs packages sur Packagist et n’a trouvé que 23 cas qui seront affectés par ce changement. Nous pouvons conclure que l’impact de ce changement – techniquement irréversible – sera faible, c’est pourquoi les internes ont décidé de l’ajouter dans PHP 8.1. N’oubliez pas que la plupart d’entre nous gagneront à ce changement, étant donné l’impact positif sur les performances qu’il a partout dans notre code.
#Migrations de ressources vers des objets
Ces changements s’inscrivent dans la vision à long terme de convertir toutes les ressources en objets dédiés. Vous pouvez en savoir plus à ce sujet ici .
Fonctions Fileinfo avec des finfo
objets
Fonctions comme finfo_file
et finfo_open
utilisées pour accepter et renvoyer des ressources. Depuis PHP 8.1, ils fonctionnent avec des finfo
objets.
Fonctions IMAP avec des IMAPConnection
objets
Tout comme le changement fileinfo, IMAP fonctionne comme imap_body
et imap_open
ne fonctionne plus avec les ressources
#Déprécier le passage de null à des arguments non nullables de fonctions internes rfc
Ce changement est simple : les fonctions internes acceptent actuellement les null
arguments non nullables, cette RFC désapprouve ce comportement. Par exemple, c’est actuellement possible :
str_contains("string", null);
En PHP 8.1, ces types d’erreurs lanceront un avertissement de dépréciation, en PHP 9, ils seront convertis en erreurs de type.
#Autovivification activée false
rfc
Du RFC :
PHP permet nativement l’autovivification (création automatique de tableaux à partir de fausses valeurs). Cette fonctionnalité est très utile et utilisée dans de nombreux projets PHP, surtout si la variable n’est pas définie. Cependant, il y a une petite bizarrerie qui permet de créer un tableau à partir d’une valeur false et null.
Vous pouvez lire les détails sur la page RFC. En résumé, ce comportement est obsolète :
$array = false;
$array[] = 2;
Automatic conversion of false to array is deprecated
#Autres petits changements
Avec chaque version, il y a un tas de changements très mineurs dans la langue. Tous sont répertoriés dans le guide de MISE À JOUR sur GitHub et les petites dépréciations RFC , assurez-vous de le vérifier si vous voulez connaître chaque petit détail.
Voici un résumé des changements les plus importants :
MYSQLI_STMT_ATTR_UPDATE_MAX_LENGTH
n’a plus d’effetMYSQLI_STORE_RESULT_COPY_DATA
n’a plus d’effet- AOP::ATTR_STRINGIFY_FECHES fonctionne maintenant aussi avec les booléens
- Les entiers et les flottants dans les ensembles de résultats PDO MySQL et Sqlite seront renvoyés à l’aide de types PHP natifs au lieu de chaînes lors de l’utilisation d’instructions préparées émulées
- Les fonctions comme
htmlspecialchars
ethtmlentities
maintenant s’échappent également'
par défaut vers'
; UTF-8 malformé sera également remplacé par un caractère Unicode, au lieu d’aboutir à une chaîne vide - Le
hash
,hash_file
ethash_init
ont un argument supplémentaire qui leur est ajouté appelé$options
, il a une valeur par défaut de[]
donc cela n’affectera pas votre code - Nouveau support pour
MurmurHash3
etxxHash
C’est tout pour l’instant, gardez à l’esprit que je mettrai régulièrement à jour ce post au cours de l’année. Êtes-vous enthousiasmé par PHP 8.1 ? Faites le moi savoir