# PHP 8.0 à 8.5 : les principales nouveautés

> Nouveautés de PHP 8 de 8.0 à 8.5 : fonctions clés par version, exemples de code, dépréciations avec risque de mise à niveau et points de sécurité.

Source : https://phpsos.de/fr/php/php-8-neuerungen/  
État : 25/10/2026  
Fournisseur : PHP SOS, Assistance d'urgence PHP et sécurité des serveurs. Aide immédiate par WhatsApp : https://wa.me/491736494914?text=Bonjour%20PHP%20SOS%2C%20nous%20avons%20besoin%20d%27aide%20avec%20notre%20serveur%20PHP.%20Entreprise%20%3A%20%E2%80%A6%20Site%20web%20%3A%20%E2%80%A6

**En bref :** PHP 8.0 (novembre 2020) a apporté les arguments nommés, les attributs, les types union, `match`, l'opérateur nullsafe et un compilateur JIT. Sont ensuite venus chaque année : 8.1 avec les énumérations et les Fibers, 8.2 avec les classes readonly, 8.3 avec les constantes de classe typées, 8.4 avec les property hooks et 8.5 avec l'opérateur pipe et l'extension URI. Chaque version déprécie aussi des éléments anciens. Lors d'une mise à niveau, les tests comptent donc, et pour la sécurité, l'essentiel est d'exploiter une branche prise en charge avec un niveau de correctifs à jour.

## Les nouveautés de PHP 8 en un coup d'œil

Le tableau résume les points clés des pages de publication de php.net. Dates de première publication selon php.net.

| Version | Parue le | Principales nouveautés | Sélection de dépréciations et de ruptures |
|---|---|---|---|
| 8.0 | 26/11/2020 | arguments nommés, attributs, Constructor Property Promotion, types union, `match`, `?->`, JIT | `0 == 'foobar'` vaut désormais `false`, erreurs de type au lieu d'avertissements |
| 8.1 | 25/11/2021 | énumérations, propriétés readonly, First-Class Callables `strlen(...)`, `new` dans les initialiseurs, types intersection, `never`, Fibers | – |
| 8.2 | 08/12/2022 | classes readonly, types DNF, `null`/`false`/`true` comme types, extension Random, constantes dans les traits, `#[\SensitiveParameter]` | propriétés dynamiques dépréciées |
| 8.3 | 23/11/2023 | constantes de classe typées, `#[\Override]`, `json_validate()`, `mb_str_pad()`, `php -l` pour plusieurs fichiers | – |
| 8.4 | 21/11/2024 | property hooks, visibilité asymétrique, `#[\Deprecated]`, nouvelle API DOM avec HTML5, `BcMath\Number`, `array_find()`, objets paresseux | paramètres implicitement nullables dépréciés ; IMAP, OCI8, PDO_OCI, pspell déplacés vers PECL |
| 8.5 | 20/11/2025 | opérateur pipe, extension URI, Clone With, `#[\NoDiscard]`, `array_first()`/`array_last()` | opérateur backtick déprécié, `disable_classes` supprimé |

## PHP 8.0 et 8.1 : le grand pas

PHP 8.0 a rendu le langage nettement plus strict et plus expressif. Selon la page de publication, les fonctions internes lèvent désormais systématiquement `TypeError` ou `ValueError` au lieu d'émettre de simples avertissements. Les comparaisons entre nombres et chaînes de caractères suivent des règles plus propres.

```php
<?php
// PHP 8.0 : match compare strictement et n'a pas besoin de break
$status = 404;
echo match (true) {
    $status >= 500 => 'Serverfehler',
    $status >= 400 => 'Anfragefehler',
    default        => 'in Ordnung',
};

// PHP 8.0 : opérateur nullsafe
$land = $bestellung?->kunde?->adresse?->land;
```

PHP 8.1 a apporté les énumérations, c'est-à-dire des types énumérés à valeurs fixes, et les propriétés readonly, qui ne peuvent être définies qu'une seule fois :

```php
<?php
enum Rolle: string {
    case Leser = 'leser';
    case Redakteur = 'redakteur';
    case Admin = 'admin';
}

final class Benutzer {
    public function __construct(
        public readonly string $name,
        public readonly Rolle $rolle,
    ) {}
}

$b = new Benutzer('Erika', Rolle::from('redakteur'));
```

`Rolle::from()` lève une erreur pour les valeurs inconnues. Cela évite que des chaînes arbitraires issues de formulaires passent pour un rôle. Qui a besoin d'une valeur vide plutôt que d'une erreur utilise `Rolle::tryFrom()`, qui renvoie `null` pour les valeurs inconnues.

Également nouveaux dans 8.1, les Fibers, une base pour les traitements concurrents sur laquelle reposent les bibliothèques de traitement asynchrone. Dans l'exploitation normale d'un site web, on s'en aperçoit peu ; dans les frameworks modernes et les files d'attente, en revanche, si.

## PHP 8.2 et 8.3 : nettoyer et sécuriser

PHP 8.2 a déprécié les propriétés dynamiques. Qui affecte à un objet une propriété non déclarée reçoit un avis ; avec `#[\AllowDynamicProperties]`, on peut l'autoriser pour certaines classes. D'anciens plugins génèrent donc souvent de nombreux messages dans le journal.

Pour la sécurité, deux points sont intéressants : la nouvelle extension Random, dont le randomiseur par défaut utilise, selon la page de publication, un générateur aléatoire cryptographiquement sûr, et l'attribut `#[\SensitiveParameter]`, qui masque dans les traces d'appels des valeurs comme les mots de passe. Plus sur les valeurs aléatoires sûres sous [Nombres aléatoires sûrs et jetons en PHP](https://phpsos.de/fr/blog/sichere-tokens-php/).

PHP 8.3 a ajouté les constantes de classe typées, l'attribut `#[\Override]` contre les fautes de frappe lors de la redéfinition de méthodes et `json_validate()`, qui vérifie du JSON sans le décoder entièrement.

## PHP 8.4 et 8.5 : des outils de langage modernes

PHP 8.4 a introduit les property hooks, donc de la logique directement sur les propriétés, et la visibilité asymétrique comme `public private(set)`. S'y sont ajoutées une nouvelle API DOM avec prise en charge de HTML5 et des fonctions comme `array_find()`, `array_any()` et `array_all()`. Selon la page de publication, les extensions IMAP, OCI8, PDO_OCI et pspell ont été déplacées du noyau vers PECL. Les applications qui utilisent par exemple IMAP ont alors besoin d'un paquet distinct.

PHP 8.5 a apporté l'opérateur pipe, qui enchaîne les appels de gauche à droite :

```php
<?php
$slug = '  Neue Produkte 2026  '
    |> trim(...)
    |> strtolower(...)
    |> (fn(string $s): string => str_replace(' ', '-', $s));
// Résultat : "neue-produkte-2026"
```

Une extension URI est également nouvelle : elle décompose les adresses selon la RFC 3986 et la norme WHATWG URL. C'est pertinent pour la sécurité, car des URL analysées de façon non uniforme sont une cause connue de contrôles contournés. L'opérateur backtick, forme abrégée de `shell_exec()`, est déprécié, et le réglage `disable_classes` a été supprimé. Qui l'utilisait devrait adapter son durcissement.

## Nouveautés, mises à niveau et PHP2Shell

De nouvelles fonctionnalités du langage ne comblent aucune faille dans l'interpréteur. Contre PHP2Shell, seul le niveau de correctifs actuel de la branche concernée aide : 8.5.12, 8.4.27, 8.3.36 ou 8.2.35. Pour PHP 8.1 et 8.0, il n'existe plus de mises à jour officielles. Qui y reste bloqué doit passer à une version supérieure, et là, les nouveautés aident peu, les ruptures beaucoup.

Une voie de mise à niveau sûre en cinq étapes :

1. Fixer la version cible, en accord avec les exigences système de l'éditeur et avec le [cycle de publication](https://phpsos.de/fr/php/release-zyklus/).
2. Amener les dépendances Composer et les plugins à des versions compatibles.
3. Vérifier le code par analyse statique et tests par rapport à la version cible.
4. Essayer dans un environnement de test avec une copie des données de production, analyser les journaux à la recherche de dépréciations.
5. Basculer, redémarrer tous les processus PHP et documenter l'état.

Des informations de fond sur les types figurent dans [Le système de types de PHP](https://phpsos.de/fr/php/typsystem/).

## Comment PHP SOS aide-t-il concrètement ?

- **Vérifier la compatibilité :** nous analysons votre code et vos extensions à la recherche de ruptures par rapport à la version cible.
- **Réaliser la mise à niveau :** avec la [migration vers une version de PHP prise en charge](https://phpsos.de/fr/leistungen/php-migration-legacy/), nous faisons monter les applications de version, après tests.
- **Adapter le durcissement :** nous remplaçons les réglages supprimés comme `disable_classes` par des alternatives efficaces.
- **Maintenir le niveau de correctifs :** après la mise à niveau, nous maintenons la branche à jour et prouvons chaque redémarrage.


## Questions fréquentes

**Quelle version de PHP 8 dois-je utiliser aujourd'hui ?**  
Pour les nouveaux projets, PHP 8.4 ou 8.5, car ce sont elles qui sont prises en charge le plus longtemps : 8.4 jusqu'à fin 2028, 8.5 jusqu'à fin 2029. L'essentiel est ce que votre application prend en charge selon les exigences système de l'éditeur. PHP 8.2 prend fin le 31 décembre 2026.

**Qu'est-ce qui casse le plus souvent en passant de PHP 7.4 à PHP 8 ?**  
Ce sont souvent des contrôles de type plus stricts : dans PHP 8, les fonctions internes lèvent des TypeError ou ValueError au lieu d'émettre de simples avertissements. Les comparaisons modifiées entre nombres et chaînes de caractères se remarquent aussi. L'analyse statique et les tests en révèlent la plupart à l'avance.

**Le JIT rend-il mon site plus rapide ?**  
Le plus souvent à peine. Selon la page de publication de PHP 8.0, les performances des applications web typiques sont à peu près au niveau de PHP 7.4, tandis que les tâches exigeant beaucoup de calcul peuvent nettement en profiter. Depuis PHP 8.4, le JIT est désactivé par défaut.

**Quelles nouveautés aident la sécurité ?**  
Notamment la nouvelle extension Random dans PHP 8.2, avec un standard cryptographiquement sûr, l'attribut SensitiveParameter contre les mots de passe dans les traces d'appels, les énumérations et propriétés readonly pour des données plus univoques, ainsi que les erreurs de type plus systématiques depuis PHP 8.0.

## Sources

- [php.net : publication de PHP 8.0](https://www.php.net/releases/8.0/en.php)
- [php.net : publication de PHP 8.4](https://www.php.net/releases/8.4/en.php)
- [php.net : publication de PHP 8.5](https://www.php.net/releases/8.5/en.php)
- [PHP 8 ChangeLog](https://www.php.net/ChangeLog-8.php)
- [php.net : versions prises en charge](https://www.php.net/supported-versions.php)
