URL: https://linuxfr.org/news/php-7-4 Title: PHP 7.4 Authors: NonolapĂ©ro Oliver, Davy Defaud, Yves Bourguignon, Nils Ratusznik, ZeroHeure, Julien Jorge, Dafyd, windu.2b, Ysabeau đŸ§¶, bobble bubble, dourouc05 et Christophe "CHiPs" PETIT Date: 2019ćčŽ10月11æ—„T23:15:48+02:00 License: CC By-SA Tags: php, web, dĂ©veloppement_web et php7 Score: 55 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_. ---- [Une revue d’une grande partie des nouveautĂ©s](https://stitcher.io/blog/new-in-php-74) [Site officiel de PHP](https://www.php.net/) [Tout pour se prĂ©parer Ă  PHP 7.4 (confĂ©rence forum PHP 2019)](https://afup.org/talks/3120-tout-pour-se-preparer-a-php-7-4) [Liste des RFC de la version](https://wiki.php.net/rfc#php_74) [PHP 8 et le JIT (confĂ©rence forum PHP 2019)](https://afup.org/talks/3015-php-8-et-just-in-time-compilation) ---- La version PHP 7.4 apporte de nombreuses fonctionnalitĂ©s et en supprime une : - [*null coalescing assignment operator*](https://wiki.php.net/rfc/null_coalesce_equal_operator), proposĂ© par Midori Kocak ; - [fonctions flĂ©chĂ©es 2.0](https://wiki.php.net/rfc/arrow_functions_v2), proposĂ©es par Nikita Popov, Levi Morrison et Bob Weinand ([PR](https://github.com/php/php-src/pull/3941 "Pull Request")) ; - [propriĂ©tĂ©s typĂ©es 2.0](https://wiki.php.net/rfc/typed_properties_v2), proposĂ©es par Nikita Popovet et Bob Weinand ([PR](https://github.com/php/php-src/pull/3734 "Pull Request")) ; - [prĂ©chargement](https://wiki.php.net/rfc/preload), proposĂ© par Dmitry Stogov ; - [amĂ©lioration d’`openssl_random_pseudo_bytes()`](https://wiki.php.net/rfc/improve-openssl-random-pseudo-bytes), proposĂ©e par Sammy Kaye Powers ([PR](https://github.com/php/php-src/pull/3649 "Pull Request")) ; - [rĂ©fĂ©rences faibles](https://wiki.php.net/rfc/weakrefs) (_weak references_), proposĂ©es par _krakjoe_ ; - [extension de hachage toujours disponible](https://wiki.php.net/rfc/permanent_hash_ext), proposĂ©e par Kalle Sommer Nielsen ; - [FFI](https://wiki.php.net/rfc/ffi) (_Foreign Function Interface_), proposĂ© par Dmitry Stogov ; - [registre de hachage de mot de passe](https://wiki.php.net/rfc/password_registry), proposĂ© par Sara Golemon ([PR](https://github.com/php/php-src/pull/3609 "Pull Request")) ;; - [ajout de `mb_str_split()`](https://wiki.php.net/rfc/mb_str_split) pour couper une chaĂźne de caractĂšres sur plusieurs octets, proposĂ© par Rumi Legal ([P](https://github.com/php/php-src/pull/3715) [R](https://github.com/php/php-src/pull/3808)) ; - [rĂ©flectivitĂ© pour les rĂ©fĂ©rences](https://wiki.php.net/rfc/reference_reflection) proposĂ©e par Nikita Popov ([PR](https://github.com/php/php-src/pull/3550 "Pull Request")) ; - [nouveau mĂ©canisme de sĂ©rialisation](https://wiki.php.net/rfc/custom_object_serialization), proposĂ© par Nikita Popov ([PR](https://github.com/php/php-src/pull/3761)) ; - [fin de la prise en charge du format](https://wiki.php.net/rfc/jit) [WDDX](https://fr.wikipedia.org/wiki/Web_Distributed_Data_eXchange), proposĂ©e par Dmitry Stogov et Zeev Suraski ([51 fichiers supprimĂ©s](http://git.php.net/?p=php-src.git;a=commit;h=6bbb18a0b6bef11222caaa55c00abdbcbb55d54b)). # 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 : ```php $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](https://wiki.php.net/rfc/arrow_functions_v2). 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](https://apiumhub.com/tech-blog-barcelona/functional-php/) Ă  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. ```php $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. ```php 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 : ```php $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](https://wiki.php.net/rfc/union_types_v2), 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](https://github.com/dstogov/php-ffi)) : ```php $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](https://github.com/vdechenaux/PhpWebcam). ## 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](https://github.com/composer/composer/issues/7777#issuecomment-440268416). 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++](https://wiki.php.net/pplusplus/faq) (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](https://fr.wikipedia.org/wiki/Raku_(langage_de_programmation)) créé initialement pour rendre le langage [Perl](https://fr.wikipedia.org/wiki/Perl_(langage)) plus accessible. Le moteur d’exĂ©cution de PHP pourrait alors interprĂ©ter indiffĂ©remment un PHP *Classic* `` et un P++ ``. Benjamin Eberlei [propose](https://beberlei.de/2019/08/14/pplusplus_is_a_bad_idea.html) d’utiliser ``. Un [sondage ouvert Ă  tous](https://www.strawpoll.me/18448151) 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](https://wiki.php.net/rfc/p-plus-plus#vote), 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](https://fr.wikipedia.org/wiki/Compilation_Ă _la_volĂ©e) (_JIT_) [proposĂ©e par Dmitry Stogov](https://wiki.php.net/rfc/jit). En 2011, Facebook annonçait des performances incroyables avec [HHVM](https://en.wikipedia.org/wiki/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](https://github.com/zendtech/php-src/tree/jit-dynasm-7.4) dans PHP 7.4 en mode expĂ©rimental. Ce changement correspond au plus [grand _commit_](https://github.com/php/php-src/commit/9a06876072b9ccb023d4a14426ccb587f10882f3) 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Ă©](https://w3techs.com/technologies/overview/programming_language/all) 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_](https://w3techs.com/technologies). Avec un zoom sur les [versions de PHP](https://w3techs.com/technologies/details/pl-php/all/all) : * 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.

AltStyle ă«ă‚ˆăŁăŠć€‰æ›ă•ă‚ŒăŸăƒšăƒŒă‚ž (->ă‚ȘăƒȘă‚žăƒŠăƒ«) /