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'extensionext-curlréé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.