Sommaire
La version PHP 7.4 apporte de nombreuses fonctionnalités et en supprime une :
-
null coalescing assignment operator, proposé par Midori Kocak ;
-
fonctions fléchées 2.0, proposées par Nikita Popov, Levi Morrison et Bob Weinand (PR) ;
-
propriétés typées 2.0, proposées par Nikita Popovet et Bob Weinand (PR) ;
-
préchargement, proposé par Dmitry Stogov ;
-
amélioration d’
openssl_random_pseudo_bytes()
, proposée par Sammy Kaye Powers (PR) ;
-
références faibles (weak references), proposées par krakjoe ;
-
extension de hachage toujours disponible, proposée par Kalle Sommer Nielsen ;
-
FFI (Foreign Function Interface), proposé par Dmitry Stogov ;
-
registre de hachage de mot de passe, proposé par Sara Golemon (PR) ;;
-
ajout de
mb_str_split()
pour couper une chaîne de caractères sur plusieurs octets, proposé par Rumi Legal (P R) ;
-
réflectivité pour les références proposée par Nikita Popov (PR) ;
-
nouveau mécanisme de sérialisation, proposé par Nikita Popov (PR) ;
-
fin de la prise en charge du format WDDX, proposée par Dmitry Stogov et Zeev Suraski (51 fichiers supprimés).
Réduction de la verbosité du langage
Null coalescing assignment operator
Cette nouveauté évite de dupliquer le nom de la variable de part et d’autre de l’opérateur d’affectation. Par exemple, les deux lignes suivantes ont le même comportement :
$this->request->data['comments']['user_id'] = $this->request->data['comments']['user_id'] ?? 'value';
$this->request->data['comments']['user_id'] ??= 'value';
Fonctions fléchées
Cette nouveauté a été définie dans cette RFC. Elle vise, entre autres, à rendre l’usage du côté fonctionnel du langage plus agréable. Oui, oui, PHP a quelques marges d’amélioration à ce niveau‑là !
Ici, il sera plus agréable de remplacer les bons vieux foreach()
pour traiter les tableaux par des array_map()
ou des array_filter()
. Globalement ça s’inspire des fonctions fléchées du JavaScript.
$double = array_map(fn($e) => 2 * $e, [1, 2, 3]);
$utilisateursMineurs = array_filter($users, fn(User $user) => $user->age < 18);
Nous pouvons noter la cohérence du langage entre les deux fonctionnalités, l’ordre d’appel entre le tableau et la méthode de retour n’est pas le même.
Évolution de la syntaxe
Séparateur d’unité
Il est possible d’ajouter un séparateur d’unité pour les nombres afin de les rendre plus lisibles. Par exemple, $milliard = 1000000000
pourra s’écrire $milliard = 1_000_000_000
. En revanche, attention à l’utilisation, il y a des risques de ne pas affecter la bonne valeur.
Les opérateurs ternaires imbriqués ne sont plus associés par la gauche
PHP était un des rares langages à proposer une associativité des ternaires par la gauche. Et pour éviter aux développeurs de se prendre les pieds dans le tapis, elle disparaît. Le mieux étant tout de même d’éviter les ternaires imbriqués.
Un typage plus présent
Depuis la version 7.0, le typage est de plus en plus présent au sein du langage. Il est possible de typer les arguments et le type de retour d’une méthode. Dorénavant, il sera aussi possible de spécifier le type des attributs d’une classe.
class Sportif
{
private Sport $sport = 'cyclimse';
private Humain $humain;
public function __construct(Humain $humain, Sport $sport)
{
$this->humain = $humain;
$this->sport = $sport;
}
public function entrainer():void
{
$this->humain->ajouteEntrainement($this->sport);
}
Ces ajouts sur les types facilitent la compréhension du code. En revanche, sans contrainte, PHP a un typage dynamique, donc le code suivant n’a pas forcément un résultat intuitif :
$somme = function (int $a, int $b): int {return $a + $b; };
echo $somme("1", 2.1); // affiche 3
En forçant une évaluation stricte des types en plaçant declare(strict_types=1);
en début de fichier, le code déclenche une erreur sur le typage. Ainsi, le développeur est forcé à prêter plus attention aux arguments passés aux méthodes.
En PHP 8, s’ajouteront les types unions, et espérons qu’ils seront accompagnés par des énumérations.
Améliorations des performances
Comme à chaque fois depuis la version 7.0, les performances natives du langage s’améliorent. Il est actuellement un des langages interprétés les plus rapides. Il faut néanmoins relativiser, car un langage qui va vite c’est une chose, mais si du temps est perdu à attendre le retour d’une requête en base de données ou, pire, depuis le réseau, les gains côté PHP ne sont pas très utiles. C’est d’ailleurs une des raisons pour lesquelles le JIT ne sera pas activé par défaut en PHP 8.
Foreign Function Interface
L’idée est ici de pouvoir appeler un programme en C depuis un script PHP, un peu à l’idée de ce qu’il est possible de faire en Python en écrivant du CPython.
Il sera possible d’écrire des choses du genre (source) :
$libc = FFI::cdef("
int printf(const char *format, ...);
const char * getenv(const char *);
unsigned int time(unsigned int *);
typedef unsigned int time_t;
typedef unsigned int suseconds_t;
struct timeval {
time_t tv_sec;
suseconds_t tv_usec;
};
struct timezone {
int tz_minuteswest;
int tz_dsttime;
};
int gettimeofday(struct timeval *tv, struct timezone *tz);
", "libc.so.6");
$libc->printf("Hello World from %s!\n", "PHP");
var_dump($libc->getenv("PATH"));
var_dump($libc->time(null));
$tv = $libc->new("struct timeval");
$tz = $libc->new("struct timezone");
$libc->gettimeofday(FFI::addr($tv), FFI::addr($tz));
var_dump($tv->tv_sec, $tv->tv_usec, $tz);
Cette fonctionnalité ouvre la possibilité d’effectuer des traitements qui habituellement ne se font pas en PHP. D’ailleurs, voici un exemple d’utilisation.
Préchargement
L’idée est de charger des fichiers afin que PHP crée un « binaire ». En contre‑partie, la mise à jour du binaire devra attendre un prochain démarrage et le temps de démarrage sera un peu plus long. Ce préchargement est donc intéressant pour les fichiers qui évoluent rarement, globalement ceux du cadriciel. En fonction des projets, il peut être intéressant de ne précharger que les fichiers les plus utilisés, comme le montre ce commentaire.
La suite ?
P++, Bringing Peace to the Galaxy
En août 2019, la communauté s’était posé la question sur la création d’une variante du PHP : P++ (c’est un nom temporaire et on peut aussi lire PHP++). L’idée était de nettoyer le langage de ses aspects pas toujours cohérents, mais conservés pour des raisons de compatibilité. Un peu comme pour le langage Raku créé initialement pour rendre le langage Perl plus accessible. Le moteur d’exécution de PHP pourrait alors interpréter indifféremment un PHP Classic <?php ?>
et un P++ <?p++ ?>
. Benjamin Eberlei propose d’utiliser <?php declare(std=20); ?>
.
Un sondage ouvert à tous montre que 60 % des répondants souhaitent un PHP 8 rétrocompatible, et un petit 20 % pour passer à P++. Les mainteneurs se sont aussi exprimés lors d’un sondage plus formel, et P++ ne verra pas le jour, car trop d’énergie à investir sur deux langages, la fragmentation de la communauté PHP…
PHP 8
En fin d’année prochaine, PHP 8 devrait débarquer avec quelques gros changements. Le plus important est, peut‑être, la compilation à la volée (JIT) proposée par Dmitry Stogov.
En 2011, Facebook annonçait des performances incroyables avec HHVM, son implémentation d’un moteur d’exécution PHP exploitant la compilation à la volée. Mais cette technique pour optimiser l’exécution de PHP n’avait pas été retenue pour le moteur d’exécution de référence. Néanmoins, PHP 7 a pu bénéficier d’autres mécanismes pour améliorer ses performances, rattraper HHVM et susciter un regain d’intérêt pour PHP.
Aujourd’hui, près de dix ans plus tard, il ne reste plus beaucoup d’options pour continuer d’améliorer les performances de PHP. Bien que la compilation à la volée ne devrait pas beaucoup améliorer la performance du rendu des pages Web, cette technique apporte deux avantages :
- une très bonne approche pour l’utilisation de PHP dans du calcul intensif, et cela devrait permettre d’utiliser PHP dans des domaines où on ne le considérait pas comme une option ;
- permettre de basculer des pans entiers du code PHP par l’équivalent dans un langage plus proche du processeur (comme le langage C) lors de cette compilation à la volée.
Cette compilation à la volée a failli être intégrée dans PHP 7.4 en mode expérimental. Ce changement correspond au plus grand commit de l’histoire de PHP.
La future version PHP 8 apportera également d’autres améliorations que nous aurons plaisir à partager dans un an…
2029
Utilisera‐t‐on PHP dans dix ans, en 2029 ?
D’après le site W3Techs, PHP est encore et toujours le langage le plus utilisé côté serveur Web. Les statistiques sont mises à jour quotidiennement. Voici les chiffres lors de la rédaction de cette dépêche :
- 79 % PHP ;
- 11 % ASP.NET ;
- 5 % Java et Scala ;
- 3 % Ruby (vive LinuxFr.org) ;
- 2 % HTML (fichiers statiques) ;
- 1 % Python ;
- 1 % JavaScript.
Pour la méthodologie utilisée, lire les explications fournies par W3Techs.
Avec un zoom sur les versions de PHP :
- PHP 3 0,0x % 😱 plus maintenu depuis 19 ans !
- PHP 4 0,5 % 😵 plus maintenu depuis 11 ans !
- PHP 5 58 % 😮 plus maintenu depuis un an ;
- PHP 6 0 % 🤐 version abandonnée, jamais sortie ;
- PHP 7 42 % 😀 version actuelle ;
- PHP 8 0 % 🤩 sortie prévue dans un an.