Greboca  

DLFP - Dépêches  -  PHP 7.4

 -  29 novembre - 

Il y a bien longtemps qu’une nouvelle version de PHP n’avait pas été commentée ici. En fait, depuis la sortie de la version 7.0 qui s’est faite dans la douleur après l’abandon de la version 6. Le langage sort désormais avec une nouvelle version chaque fin d’année. La rétrocompatibilité est un point qui n’est pas négligé d’une version à l’autre, d’où une évolution plutôt lente.
La majorité des logiciels peut migrer sans trop d’appréhension. Depuis plusieurs versions, l’amélioration des performances est un point essentiel du fait de la concurrence avec HHVM, développé par Facebook. Au final, cette version, qui est la dernière de la branche 7, apporte un système de type plus fort, plus de performance et fait en sorte de diminuer le code cérémonial, aka boilerplate.

Sommaire

La version PHP 7.4 apporte de nombreuses fonctionnalités et en supprime une :

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.

Commentaires : voir le flux atom ouvrir dans le navigateur

par Nonolapéro, Oliver, Davy Defaud, Yves Bourguignon, ZeroHeure, Nils Ratusznik, Dafyd, Julien Jorge, windu.2b, Christophe "CHiPs" PETIT, bobble bubble, Ysabeau, dourouc05

DLFP - Dépêches

LinuxFr.org

Manifestation contre le Brevet Logiciel Unitaire, jeudi 12 décembre 2019 à Bruxelles

 -  10 décembre - 

La FFII (Association pour une infrastructure de l’information libre ou Förderverein für eine Freie Informationelle Infrastruktur e.V.) appelle à (...)


Lettre d’information XMPP, 3 décembre 2019, XMPP dans toutes les langues

 -  8 décembre - 

Bienvenue dans la lettre d’information XMPP couvrant le mois de novembre 2019. Aidez‑nous à entretenir cet effort communautaire dont le processus (...)


Firefox 71

 -  8 décembre - 

La version 71 de Firefox desktop a été publiée le 3 décembre 2019. Difficile de dégager cette fois une ligne directrice de cette nouvelle version aux (...)


Proxmox VE 6.1 est disponible

 -  5 décembre - 

Proxmox est une plate‐forme de gestion de virtualisation libre (AGPL v3) permettant de gérer des machines virtuelles KVM et des conteneurs LXC. (...)


Loki, centralisation de log à la sauce Prometheus

 -  30 novembre - 

Cet article est une rapide introduction à Loki. Ce projet est soutenu par Grafana et a pour but de centraliser des journaux d’activités (serveurs ou (...)