PHP 8.1 est une nouvelle version majeure de PHP, qui apporte plusieurs nouvelles fonctionnalités, des améliorations de la qualité de vie et tente de préparer PHP à aplanir certaines de ses fonctionnalités héritées en dépréciant et en restreignant certaines fonctionnalités indésirables.

PHP 8.1 est une continuation des progrès de PHP en fournissant des améliorations de système de type. Il ajoute également plus de fonctionnalités qui encouragent la programmation défensive.

Les responsables des versions de PHP 8.1 sont Joe Watkins, Ben Ramsey et Patrick Allaert. Ils feront les versions mineures de la série PHP 8.1 jusqu’à ce que PHP 8.1 atteigne sa fin de vie à la fin de l’année 2024.

Certains des points forts de PHP 8.1 incluent la prise en charge des énumérations, des fibres, du type jamais renvoyé, des types d’intersection, des propriétés en lecture seule et de la syntaxe appelable de première classe. Il désapprouve également une poignée de fonctionnalités, ce qui peut ajouter quelques frictions lors de la mise à niveau des applications PHP héritées vers PHP 8.1.

Points forts de PHP 8.1

PHP 8.1 ajoute des fonctionnalités telles que Enums, qui était l’une des fonctionnalités les plus fréquentes et les plus attendues pour atterrir dans PHP. En outre, il ajoute Fibers, ce qui constitue un pas important vers les applications PHP simultanées, ce qui place PHP au-delà du modèle traditionnel de demande-réponse.

Énumérations

PHP 8.1 ajoute la prise en charge des énumérations. Une énumération, ou une énumération en abrégé, est un type énuméré qui a un nombre fixe de valeurs possibles.

Une analogie populaire pour un Enum est les combinaisons dans un jeu de cartes à jouer. Un jeu de cartes à jouer a quatre couleurs, et elles sont fixes : trèfle, carreau, cœur et pique.

En PHP, ces combinaisons peuvent être énumérées avec un Enum :

enum Suit {

    case Clubs;

    case Diamonds;

    case Hearts;

    case Spades;

}

Avec Suit Enum, il est désormais possible d’imposer des types lors de l’acceptation ou du retour d’une valeur de costume :

function pick_card(Suit $suit) {}
pick_card(Suit::Clubs);
pick_card(Suit::Diamonds);
pick_card(Suit::Hearts);
pick_card(Suit::Spades);

Contrairement à l’utilisation de chaînes ou de nombres spéciaux en interne (c’est-à-dire des nombres magiques) pour stocker et utiliser des paramètres, les énumérations rendent le code de l’application plus lisible et évitent les états d’application inattendus.

Fibres

Fibers est une nouvelle fonctionnalité de PHP 8.1 qui apporte une simultanéité légère et contrôlée à PHP.

Essentiellement, une fibre est un bloc de code qui maintient sa propre pile (variables et état), qui peut être démarré, suspendu ou terminé de manière coopérative par le code principal et la fibre.

Les fibres sont similaires aux fils d’un programme informatique. Les threads sont planifiés par le système d’exploitation et ne garantissent pas quand et à quel point les threads sont suspendus et repris. Les fibres sont créées, démarrées, suspendues et terminées par le programme lui-même, et permettent un contrôle précis de l’exécution du programme principal et de l’exécution de la fibre.

Avec Fibers, le bloc de code dans la fibre peut suspendre le bloc de code et renvoyer toutes les données au programme principal. Le programme principal peut reprendre la Fibre à partir du point où il a été suspendu.

Il est important que l’exécution simultanée ne signifie pas l’exécution simultanée. La fibre en elle-même ne permet pas l’exécution simultanée de plusieurs fibres ou du thread principal et d’une fibre. Cependant, c’est un tremplin pour les frameworks PHP concurrents pour gérer efficacement leur pile d’exécution et permettre une exécution simultanée.

Propriétés en lecture seule

PHP 8.1 prend en charge les propriétés de classe en lecture seule. Une propriété de classe déclarée en lecture seule ne peut être initialisée qu’une seule fois, et toute modification ultérieure de la propriété n’est pas autorisée.

Les propriétés de classe en lecture seule sont déclarées avec le mot clé contextuel readonly dans une propriété typée.

class User {
    public readonly int $uid;
    public function __construct(int $uid) {
        $this->uid = $uid;
    }
}

Avec une propriété en lecture seule, l’écrasement de la propriété ou l’écriture depuis l’extérieur de la classe entraîne une exception.

$user = new User(42);
$user->uid = 16; // Not allowed.

Améliorations du système de saisie

PHP 8.1 continue de fournir une syntaxe et des fonctionnalités pour écrire des applications plus défensives et typées. Cela peut également signifier que PHP 8.1 ajoutera de nouveaux avis d’obsolescence lorsque les applications héritées contiennent des signatures incompatibles pour les classes, ou parfois le manque de types lors de l’extension des classes PHP intégrées.

Types d’intersection

PHP 8.1 prend en charge les types d’intersection, ce qui permet de déclarer un type pour un paramètre, une propriété ou des types de retour et d’imposer que les valeurs appartiennent à tous les types de classe/interface déclarés. C’est le contraire de Union Types, qui autorise n’importe lequel des types déclarés. L’implémentation des types d’intersection dans PHP 8.1 est appelée types d’intersection « purs » car la combinaison de types d’union et de types d’intersection dans la même déclaration n’est pas autorisée.

Les types d’intersection sont déclarés en combinant les noms de classe/interface avec un signe &.

Pour un exemple de cas d’utilisation, considérons les interfaces Iterator et Countable intégrées de PHP. L’interface Iterator permet d’itérer l’objet de classe à l’aide de foreach. Cependant, à moins que la même classe n’implémente l’interface Countable, il n’est pas possible d’appeler la fonction count() sur de tels objets.

Avec un type d’intersection, il est désormais possible de vérifier le type des objets de classe pour implémenter à la fois les interfaces Iterator et Countable.

function count_and_iterate(Iterator&\Countable $value) {
    foreach($value as $val) {}
    count($value);
}

Dans l’extrait ci-dessus, le paramètre $value doit être un objet de la classe qui implémente à la fois les interfaces Iterator et Countable. Le passage de toute autre valeur provoque une erreur de type.

type de retour never

never un nouveau type de retour n’est ajouté dans PHP 8.1.

Une fonction/méthode déclarée avec le type Never return indique qu’elle ne retournera jamais de valeur et lève toujours une exception ou se termine par un appel die/exit.

type de retour never est similaire au type de retour void existant, mais le type never garantit que le programme se terminera ou se lancera. En d’autres termes, une fonction/méthode déclarée never ne doit pas du tout appeler return, même pas dans le return ; former.

function redirect(string $url): never {
    header('Location: ' . $url);
    exit();
}

Resource à la migration d’objets

PHP 8.1 poursuit ses efforts pour migrer les types de ressources hérités vers des classes standard. En PHP 8.1, les modifications suivantes sont apportées :

Extension finfo : les ressources file_info sont migrées vers les objets finfo existants

IMAP : les ressources imap sont des objets de classe IMAP\Connection

Extension FTP : les ressources de connexion sont des objets de classe FTP\Connection

Extension GD : les identifiants de police sont des objets de classe GdFont

LDAP : ressources migrées vers les objets LDAP\Connection, LDAP\Result et LDAP\ResultEntry

PostgreSQL : ressources migrées vers les objets \PgSql\Connection, \PgSql\Result et \PgSql\Lob

Pspell : les ressources de configuration pspell, pspell sont des objets de classe PSpell\Dictionary, PSpell\Config

Nouveaux algorithmes de hachage

PHP 8.1 ajoute la prise en charge des algorithmes de hachage xxHash et MurMurHash3. Ils font partie des algorithmes de hachage les plus rapides et peuvent facilement mâcher des données presque à la vitesse d’un support de stockage. PHP est le premier langage de programmation à inclure ces deux algorithmes de hachage dans sa bibliothèque standard.

Prise en charge de l’algorithme de hachage MurmurHash3

Prise en charge des algorithmes de hachage xxHash

Benchmarks d’algorithmes de hachage