# PHP 8 : toutes les infos sur la nouvelle version

Le PHP est l’un des langages de programmation les plus faciles à apprendre. Avec un bon [tutoriel PHP](https://www.ionos.fr/digitalguide/sites-internet/creation-de-sites-internet/apprendre-php/ "Apprendre PHP") et la bonne motivation, vous pouvez écrire vos premiers scripts en quelques heures et exécuter des commandes. PHP 7 a déjà permis d’optimiser sa vitesse, ce qui a conduit à un meilleur ranking. Le langage open source a fait l’objet d’une nouvelle **mise à jour majeure avec la version 8.0**. Suivie un an plus tard d’une mise à jour mineure avec la version 8.1.

## Quelles sont les fonctionnalités de PHP 8.1 ?

PHP 8.1 a été publié en version bêta et est en cours de test. La mise à jour finale ne suivra pas avant novembre 2021, mais les nouvelles fonctionnalités sont déjà connues. Vous pouvez donc vous attendre aux nouvelles fonctions suivantes :

- [Enum](https://wiki.php.net/rfc/enumerations "RFC officiel à propos des Enums") : les énumérations (énumérations avec un certain nombre de valeurs) sont maintenant disponibles comme type de variable.
- [Fibers](https://wiki.php.net/rfc/fibers "RFC officiel à propos des Fibers") : le nouveau type de bloc de code Fibers vous donne la possibilité d’exécuter plusieurs threads en parallèle.
- [Arrays](https://wiki.php.net/rfc/array_unpacking_string_keys "RFC officiel à propos de Array unpacking") : depuis PHP 7.4, vous pouvez déballer les tableaux avec des clés numériques. Cela est également possible pour les tableaux à clé contenant des chaînes de caractères.
- [Readonly](https://wiki.php.net/rfc/readonly_properties_v2 "RFC officiel à propos de Readonly") : désormais, les propriétés des classes peuvent être marquées comme 'readonly' et ne sont donc plus modifiables.
- [Intersection](https://wiki.php.net/rfc/pure-intersection-types "RFC officiel à propos des types d’intersection") : les types d’intersection (similaires aux types d’union) sont maintenant disponibles.
- [Never](https://wiki.php.net/rfc/noreturn_type "RFC officiel à propos du type de retour never") : le nouvel indice de type de retour 'never' indique qu’une fonction est terminée et ne renvoie pas d’autre valeur.
- [Final](https://wiki.php.net/rfc/final_class_const "RFC officiel à propos de final flag") : vous pouvez désormais marquer les constantes de classe avec 'final' afin qu’elles ne puissent pas être modifiées par les sous-classes.
- [Fsync](https://wiki.php.net/rfc/fsync_function "RFC officiel à propos de fsync") : PHP 8.1 introduit les deux fonctions 'fsync' et 'fdatasync' pour synchroniser les données du tampon vers le support de stockage.
- [Octal](https://wiki.php.net/rfc/explicit_octal_notation "RFC officiel à propos du préfixe octal") : afin d’afficher le système numérique octal, il sera possible à l’avenir d’utiliser le préfixe '0o' (zéro et petit O) en plus de '0' (zéro).
- [Globals](https://wiki.php.net/rfc/restrict_globals_usage "RFC officiel à propos de $GLOBALS") : l’utilisation de '$GLOBALS' a été légèrement restreinte et conduit maintenant à un message d’erreur dans certains cas.
- [Null](https://wiki.php.net/rfc/deprecate_null_to_scalar_internal_arg "RFC officiel à propos de Null") : les fonctions internes n’accepteront plus les valeurs nulles pour les arguments non nulles.

---

### Note

Ceci n’est qu’une sélection des changements les plus intéressants de PHP 8.1. De nombreuses autres innovations prévues peuvent être trouvées dans le [wiki officiel avec toutes les Request for Comments](https://wiki.php.net/rfc "Wiki zu PHP").

---

## PHP 8 : sortie en novembre 2020

Le 26 novembre 2020 dernier était publiée la dernière version du langage de script populaire, PHP 8.0.0. Cela correspond au cycle normal de trois ans de PHP. Son prédécesseur PHP 7.4 avait été publié un an auparavant, juste après que le support pour PHP 7.1 ait été interrompu. Le soutien au PSP 7.2 s’est également terminé fin 2020.

---

### Essayez PHP 8 dès maintenant !

Essayez PHP 8 dès maintenant ! Vous n’êtes pas encore client IONOS ? Optez pour l’une de nos offres économiques d’[hébergement Web](https://www.ionos.fr/hebergement/hebergement-web "Hébergement Web avec domaine inclus – IONOS"). Dans votre espace client IONOS, vous pouvez [modifier la version actuelle de PHP](https://www.ionos.fr/assistance/hebergement/gerer-la-version-php-dans-le-espace-client/afficher-ou-changer-la-version-de-php/ "Afficher ou changer la version de PHP - IONOS Assistance"), et opter pour la version de PHP 8 ou PHP 8.1 (dès que disponible).

---

## Existe-t-il des complications avec l’ancien code ?

Comme PHP 8 est une nouvelle version majeure, il faut s’attendre à ce que l’ancien code ne soit plus compatible. Toutefois, la plupart des modifications susceptibles d’entraîner des complications étaient déjà obsolètes dans les versions [7.2](https://wiki.php.net/rfc/deprecations_php_7_2 "Deprecations for PHP 7.2"), [7.3](https://wiki.php.net/rfc/deprecations_php_7_3 "Deprecations von PHP 7.3") et [7.4](https://wiki.php.net/rfc/deprecations_php_7_4 "Deprecations von PHP 7.4").

Parmi les dernières modifications, citons :

- The *real* type
- Magic quotes legacy
- *array\_key\_exists()* with objects
- *FILTER\_SANITIZE\_MAGIC\_QUOTES* filter
- Reflection *export()* methods
- *mb\_strrpos()* with encoding as 3rd argument
- *implode()* parameter order mix
- Unbinding *$this* from non-static closures
- *hebrevc()* function
- *convert\_cyr\_string()* function
- *money\_format()* function
- *ezmlm\_hash()* function
- *restore\_include\_path()* function
- *allow\_url\_include* ini directive

Si vous avez toujours maintenu votre code à jour, vous n’aurez pratiquement aucun problème, même si **les changements rétroactifs sont incompatibles**. Une liste complète des changements de cette Major Release est disponible dans la [page de projet PHP](https://www.php.net/releases/8.0/fr.php "php.net: PHP 8.0.0 Release Announcement").

---

### Note

Microsoft a annoncé qu’il ne proposera plus de support Windows pour PHP 8 et les versions ultérieures. Cependant, les développeurs de PHP ont déjà annoncé leur intention de combler eux-mêmes cette lacune.

---

## Les nouvelles fonctionnalités de PHP 8

La nouvelle version de PHP est dotée de nouvelles fonctionnalités qui offriront aux développeurs Web de nombreuses possibilités supplémentaires. Voici un résumé des principales améliorations apportées par rapport aux versions précédentes.

---

### Note

Le **30 novembre 2020**, la version PHP 7.2 atteindra sa **date officielle de fin de vie** (EOL pour End-Of-Life) et ne sera plus supportée. Pour en savoir plus à ce sujet, consultez notre article sur ce thème.

---

### Compilateur JIT

La plus grande innovation est le compilateur JIT, qui améliore sensiblement les performances. PHP n’est pas compilé, mais interprété ligne par ligne. Le compilateur JIT (JIT = Just in Time) **compile des parties du code pendant l’exécution** et agir donc comme une version en cache du code.

Cette nouvelle fonctionnalité de PHP 8 a déjà été testée de manière assez impressionnante par [Pedro Escudero](https://levelup.gitconnected.com/how-fast-is-php-8-going-to-be-f7fdc111cd6 "Rapport sur le compiler JIT"). Ce dernier a utilisé un script simple pour comparer les versions 5.3, 7.4 et 8 (avec et sans JIT). Ainsi, il a exécuté le script 100 fois dans chacune des versions et a ensuite calculé le temps moyen nécessaire à l’exécution.

Les valeurs moyennes suivantes ont donc été obtenues :

<table>
  <thead>
    <tr>
      <th>Version</th>
      <th>Temps en secondes</th>
    </tr>
  </thead>
  <tbody>
    <tr>
      <td>5.3</td>
      <td>0.64574003219604</td>
    </tr>
    <tr>
      <td>7.4</td>
      <td>0.10253500938416</td>
    </tr>
    <tr>
      <td>8 (sans JIT)</td>
      <td>0.098223924636841</td>
    </tr>
    <tr>
      <td>8 (avec JIT)</td>
      <td>0.053637981414795</td>
    </tr>
  </tbody>
</table>

Si le passage de la version 7.4 à la version 8 sans JIT ne fait pas grande différence, la différence par rapport à la version 8 avec JIT est significative. Le compilateur JIT permet **une amélioration des performances de plus de 45 %**.

### Type Union

Les types Union ont déjà fait leur apparition dans d’autres langages comme C/C++, TypeScript ou Haskell. Ici, deux types ou plus peuvent former une union et tout type mentionné peut être utilisé. Dans le code en soi, on pourrait par exemple avoir :

```none
public function foo(Foo|Bar $input): int|float;
```

Cependant, il existe une restriction, car *void* ne peut pas faire partie d’un type union, car il ne produit pas de valeur de retour. En outre, les unions nulles peuvent être déclarées avec les mentions *|null* ou *?* , comme dans cet exemple :

```none
public function foo(Foo|null $foo): void;
public function bar(?Bar $bar): void;
```

### Static return type

Static est un nom de classe spécial ; dans la nouvelle version, il devient un type Return valide en plus de *self* &amp; *parent*.

### WeakMap

WeakRefs a déjà été ajouté à PHP 7.4. PHP 8 livre maintenant avec WeakMaps l’extension de cette fonction. WeakMaps et WeakRefs peuvent être utilisés pour supprimer des objets lorsque seul le cache fait référence aux classes d’entités des objets. Cela permet **d’économiser des ressources lors de la manipulation des objets**. Un exemple tiré de la documentation :

```none
class FooBar {
    private WeakMap $cache;
    public function getSomethingWithCaching(object $obj) {
        return $this->cache[$obj] ??= $this->computeSomethingExpensive($obj);
    }
    // ...
}
```

### ::class appliqué aux objets

Dans les versions précédentes, il fallait utiliser *get\_class()* pour attribuer une classe aux objets. Maintenant, vous pouvez appliquer *::class* aux objets, ce qui permet de réduire la taille du code source.

### Stringable interface

La Stringable interface est automatiquement ajoutée aux classes qui implémente la méthode \_\_*toString()*. Auparavant, cette étape devait être effectuée manuellement. Dans le code en soi, voilà à quoi cela ressemble :

```none
class Foo
{
    public function __toString(): string
    {
        return ‘foo’;
    }
}
function bar(Stringable $stringable) { /* … */ }
bar(new Foo());
bar(‘abc’);
```

### Fonction fdiv()

Avec la nouvelle fonction fdiv(), une division par 0 est autorisée. Vous obtenez alors *INF*, *-INF* ou *NAN* comme valeur de retour.

### Type errors

Auparavant, seules les fonctions définies par l’utilisateur déclenchaient les *TypeErrors*, les fonctions internes émettaient un avertissement et *null*. Avec PHP 8, la majorité des fonctions internes renvoient également des *TypeErrors*.

### Nouvelle classification des engine-warnings

Jusqu’à présent, on notait de nombreuses erreurs qui n’apparaissaient que sous forme de warning ou de note. Une mise à jour a maintenant été effectuée. Une [liste complète des nouveaux messages d’erreur PHP](https://wiki.php.net/rfc/engine_warnings "Liste officielle des avertissements sur PHP") est disponible dans la documentation.

### Signatures correctes des méthodes magiques

Dans les versions précédentes de PHP, il était possible d’écrire des méthodes magiques avec des signatures qui ne correspondaient pas à la signature attendue, par exemple *\_\_clone(): float* oder *\_\_isset(): Closure*. Depuis l’introduction du PHP 7.0, l’utilisation correcte des méthodes magiques n’a été vérifiée que de manière aléatoire. Divers contrôles de paramètres et de valeurs de retour ont été ajoutés à la nouvelle version afin de garantir l’exactitude des signatures.

### Reflection

Les signatures Reflection ont été modifiées. A l’origine, Reflection était spécifié comme suit :

```none
ReflectionClass::newInstance($args);
ReflectionFunction::invoke($args);
ReflectionMethod::invoke($object, $args);
```

Avec PHP 8, ce sera écrit comme suit :

```none
ReflectionClass::newInstance(...$args);
ReflectionFunction::invoke(...$args);
ReflectionMethod::invoke($object, ...$args);
```

Pour prendre en charge PHP 7 et PHP 8 en même temps, vous pouvez formuler le code de la sorte :

```none
ReflectionClass::newInstance($arg = null, ...$args);
ReflectionFunction::invoke($arg = null, ...$args);
ReflectionMethod::invoke($object, $arg = null, ...$args);
```

---

### Conseil

Vous n’avez pas encore de site Web propre ? L’[hébergement dédié](https://www.ionos.fr/hebergement/hebergement-dedie "Hébergement dédié- IONOS by 1&amp;1") de IONOS est puissant et convient également aux débutants. Avec les [serveurs virtuels](https://www.ionos.fr/serveurs/vps "Louer un VPS chez IONOS") de IONOS, vous pouvez également compter sur un niveau de flexibilité particulièrement élevé et sur les meilleures performances. Choisissez l’offre qui convient le mieux à votre projet.

---


This is a markdown version of: [https://www.ionos.fr/digitalguide/sites-internet/developpement-web/php-8/](https://www.ionos.fr/digitalguide/sites-internet/developpement-web/php-8/) for AI/LLM consumption.