URL:     https://linuxfr.org/news/la-version-8-1-de-php-et-creation-de-la-fondation-php
Title:   La version 8.1 de PHP et création de la fondation PHP
Authors: Nonolapéro
        xdelatour, Xavier Teyssier, palm123, Florent Zara, windu.2b et Pierre Jarillon
Date:    2021-11-25T16:55:21+01:00
License: CC By-SA
Tags:
Score:   6


En fin d’année 2021 et sur la lancée habituelle PHP passe en version 8.1. Tout comme les autres versions, elle sera maintenue activement pendant deux années et elle recevra seulement des correctifs de sécurité une année de plus.



![Elephant PHP sur un ordinateur portable](https://i.imgur.com/7iYZ7YU.jpg "source : Ben Griffiths via Unsplash https://unsplash.com/photos/2Rd-hwT2xQ0")

----

[Site officiel](https://www.php.net/)
[Liste de diffusion](https://externals.io/)
[Page officielle PHP 8.1](https://www.php.net/releases/8.1/en.php)

----

# 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

<?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.


```php

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.


```php
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](https://amphp.org/), [ReactPHP](https://reactphp.org/) et [Swoole](https://www.swoole.co.uk/). 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](https://revolt.run/).


### `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.


```php

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](https://github.com/kocsismate/php-version-benchmarks/blob/main/docs/results/2021_11_25_10_08_1_aws_arm64_c6g_4xlarge/result.md) sur des temps de traitement d'une série de 250 requêtes trouve un temps de réponse diminué d'une vingtaine de pourcent pour une application Symfony ou Laravel et une poignée de pourcent pour un site Wordpress.


## Pour la suite


Pour ceux qui tourne 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](https://getrector.org).


À 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 consistant](https://wiki.php.net/rfc/shell_exec_result_code_param), de suppression de possibilités pour écrire [des choses atroces](https://wiki.php.net/rfc/deprecate_dynamic_properties), de [simples utilitaires](https://www.php.net/manual/en/function.array-is-list) 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é](https://externals.io/message/113981#114043) 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](https://wiki.php.net/rfc/github_issues) 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](https://blog.jetbrains.com/phpstorm/2021/11/the-php-foundation/). C’est donc une très bonne nouvelle et il faut espérer que [les dons des entreprises et des particuliers](https://opencollective.com/phpfoundation) permettront d’intégrer, de diversifier et consolider le socle des contributeurs.