Journal

PHP 8.2 à 8.4 : ce qui change vraiment pour votre code

Journal du dimanche 23 août 2026, généré le 23 août à 19:36

Fin des propriétés dynamiques (PHP 8.2)

Affecter une propriété non déclarée sur un objet standard déclenche désormais une Deprecated warning, sauf si la classe implémente #[AllowDynamicProperties] ou hérite de stdClass. C'est le signal le plus clair envoyé par le langage vers une typisation stricte des objets : tout attribut doit être déclaré explicitement.

Classes readonly et types DNF (PHP 8.2)

On pouvait déjà marquer une propriété readonly depuis 8.1 ; 8.2 permet de marquer toute la classe en une fois avec readonly class, ce qui force chaque propriété typée à être immuable après construction. PHP 8.2 introduit aussi les types DNF (Disjunctive Normal Form), qui combinent intersection et union dans une même signature :

function traite((Countable&Iterator)|null $collection): void {
    // accepte un objet qui implémente les deux interfaces, ou null
}

Enfin, null, false et true deviennent des types autonomes utilisables seuls en signature.

Constantes typées et #[Override] (PHP 8.3)

Les constantes de classe peuvent maintenant porter un type, comme les propriétés :

class Statut {
    public const string ACTIF = 'actif';
}

L'attribut #[Override] documente explicitement qu'une méthode redéfinit une méthode parente ou d'interface : si le parent supprime ou renomme la méthode, PHP lève une erreur à la compilation plutôt qu'un bug silencieux en production. À utiliser systématiquement sur vos surcharges.

Property hooks et visibilité asymétrique (PHP 8.4)

C'est le changement le plus structurant : les property hooks permettent d'attacher un comportement get/set directement à une propriété, sans passer par des méthodes accesseurs séparées :

class Produit {
    public function __construct(
        private(set) float $prixHT,
    ) {}

    public float $prixTTC {
        get => round($this->prixHT * 1.2, 2);
    }
}

$p = new Produit(100);
echo $p->prixTTC; // 120.0

La visibilité asymétrique (private(set), protected(set)) autorise une lecture publique tout en restreignant l'écriture, ce qui élimine une bonne partie des getters/setters écrits à la main.

Autres ajouts utiles

  • 8.3 : json_validate() pour valider un JSON sans le décoder entièrement.
  • 8.4 : new Classe()->methode() sans parenthèses autour de l'instanciation, et l'extension ext-curl réécrite au-dessus de cURL avec de meilleures performances.

Ces évolutions convergent toutes vers le même objectif : réduire le code défensif au profit de garanties vérifiées par le moteur lui-même.