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.