Sommaire
Quoi de neuf
Les nouveautés majeures
Les types énumérés
Jusqu’à présent cette structure n’était pas présente nativement dans le langage, elle était néanmoins implémentée dans diverses bibliothèques. C’est la bonne occasion de se débarrasser des classes remplies de constantes.
<?php
enum IP
{
case V4;
case V6;
}
// la méthode statique cases() est automatiquement implémentée
IP::cases(); // [IP::V4, IP::V6]
$versionOf = fn(string $address): ?IP => {
match(true){
case isIpV4($address) => IP::V4,
case isIpV6($address) => IP::V6,
default => null
}
};
$versionOf("192.168.0.1); // IP::V4
Propriétés de classe en lecture seule
Cette fonctionnalité, qui existe déjà dans d’autres langages (C# et TypeScript), fait son arrivée. Elle vous permettra d’avoir un objet dont les propriétés ne pourront plus être modifiées après l’instanciation. Ça va désormais être rapide pour créer des DTO.
class QuelBeauDTO
{
public function __construct(public readonly string $message){}
}
$dto = new QuelBeauDTO("LinuxFR");
echo($dto->message); // LinuxFR
$dto->message = "Vive les moules"; //Fatal error: Uncaught Error: Cannot modify readonly property QuelBeauDTO::$message
Les types intersection purs
Après les types unions lors de la version précédente, voici l’intersection. Une bonne solution pour favoriser la composition d’interface et améliorer la modularité de nos développements.
interface A{ function a(): string;}
interface B{ function b(): string;}
class Coucou implements A, B
{
function __construct(private readonly string $a, private readonly string $b){}
function a(): string
{
return $this->a;
}
function b(): string
{
return $this->b;
}
}
$ab = new Coucou("coucou", "toto");
$fn = fn(A&B $ab): string => "{$ab->a()} {$ab->b()}";
echo($fn($ab)); // coucou toto
La notion de pureté vient du fait que pour le moment il n’est pas possible d’avoir une signature du genre : A&B|C
. Une discussion houleuse s’est tenue quelques jours avant le gel des fonctionnalités sur la possibilité d’avoir des null
et la syntaxe qui l’accompagnerait. Pour rappel, les types union ont intégré le langage en version 8.0.
Autres nouveautés
Du code asynchrone avec les Fibers
Jusqu’à présent, la gestion du code asynchrone était gérée du côté des bibliothèques, les plus connues étant Amp, ReactPHP et Swoole. Chaque solution avait implémenté les logiques nécessaires à leur sauce. Avec l’arrivée des fibres dans le langage, les cartes sont rebattues et chacun devra apporter des modifications pour profiter de la partie native. D’ailleurs ReactPHP et Amp se sont associés pour écrire une couche d’abstraction nommée Revolt.
new
dans le constructeur et des constantes finales
Les constantes finales ne peuvent pas être redéfinies dans une classe enfant (mais qui utilise l’héritage ???) et il est possible d’intégrer des new
directement dans le constructeur.
class A {
private final const A = "toto";
public function __construct(private DatetimeImmutable $now = new DateTimeImmutable()){};
}
class B extend A{
private final const A = "tata"; //Fatal error: B::A cannot override final constant A::A
}
Des performances en hausse
À chaque version, des optimisations sont trouvées et il en résulte de meilleurs résultats sur différents comparatifs. Cette version ne déroge pas à la règle. Un récent comparatif sur des temps de traitement d’une série de 250 requêtes trouve un temps de réponse diminué d’une vingtaine de pourcents pour une application Symfony ou Laravel et une poignée de pourcents pour un site Wordpress.
Pour la suite
Pour ceux qui tournent sur du PHP 7.4, il va falloir songer à passer en version 8.0 dans l’année. Pour rappel, une version est maintenue pendant trois ans (deux ans de maintenance active, un an de maintenance de sécurité). Pour cela, il faut baisser les seuils d’alerte au minimum, corriger ce qui provoque les bouts de code concernés par des alertes à la main ou automatiquement avec des outils du genre Rector.
À l’heure de la rédaction de ces lignes, peu de choses seront incluses dans la prochaine version, mais on peut déjà voir que cela ne sera toujours une somme de choses pour rendre le langage plus cohérent, de suppression de possibilités pour écrire des choses atroces, de simples utilitaires pour ne pas réinventer la roue, etc.
Les changements au niveau de la communauté
PHP est un langage communautaire, à ma connaissance, il n’y a pas d’entreprise qui emploie des personnes pour travailler à plein temps sur le langage. Le langage évolue donc au gré des volontés diverses et variées de proposer des nouvelles fonctionnalités et de les implémenter. Globalement, l’évolution et la maintenance du langage ne tient qu’à une poignée de motivé(e)s. Comme pour la plupart des projets communautaires, toute aide est la bienvenue que ce soit sous la forme de traduction, de documentation, de rapports de bug, pour rajouter du code c’est un poil plus compliqué, car il faut être familier avec le C à la sauce PHP !
Migration progressive sur Github
L’infrastructure vieillissante du projet arrivant au bout de sa vie et un incident de sécurité ce printemps ont poussé à stopper les contributions sur le service git du projet. Alors que le dépôt sur Github servait de miroir, il est devenu la source principale. La gestion des bugs va également se déplacer au même endroit.
Création de la fondation PHP
Jusqu’à présent il n’y avait aucune structure officielle chapeautant le projet et rare ont été les personnes payées pour développer le langage. Ces derniers temps ce nombre ne s’élevait qu’à deux, ce qui pour un langage aussi utilisé que PHP est surprenant, voire désolant. L’un des deux principaux développeurs du projet (Nikita Popov) tant au niveau du code, que des discussions autour des évolutions prévoit de réduire la voilure. Depuis trois ans, il était rémunéré par JetBrains pour travailler sur PHP. Cette fin d’engagement a poussé différentes personnes à finaliser la mise en place d’une fondation afin de supporter financièrement des contributeurs. Vous trouverez plus de détails dans cette annonce. C’est donc une très bonne nouvelle et il faut espérer que les dons des entreprises et des particuliers permettront d’intégrer, de diversifier et consolider le socle des contributeurs.