Les propriétés dynamiques sont mortes
Depuis PHP 8.2, assigner une propriété non déclarée sur un objet standard déclenche une dépréciation (et une erreur en 9.0). Si vous dépendez encore de stdClass-like magique, ajoutez explicitement l'attribut #[AllowDynamicProperties] sur la classe concernée, ou mieux, déclarez vos propriétés.
Classes readonly entières
Avant 8.2, il fallait marquer chaque propriété readonly une à une. Désormais, on peut marquer la classe entière :
final readonly class Point
{
public function __construct(
public float $x,
public float $y,
) {}
}
Toutes les propriétés deviennent implicitement readonly et typed (les propriétés non typées sont interdites dans ce contexte). C'est idéal pour des objets valeur immuables sans écrire de boilerplate.
Types disjonctifs normaux (DNF)
PHP 8.2 autorise le mélange d'intersection et d'union dans les types, à condition de parenthéser les intersections :
function process((Countable&Iterator)|null $collection): void {}
Utile pour exprimer « soit une valeur respectant plusieurs interfaces, soit null » sans passer par une interface intermédiaire artificielle.
Constantes de classe typées (8.3)
Les constantes peuvent désormais porter un type, vérifié à la déclaration et lors du override dans les classes filles :
interface HasLimit
{
public const int MAX = 100;
}
Hooks de propriétés et visibilité asymétrique (8.4)
PHP 8.4 introduit les property hooks, qui suppriment beaucoup de getters/setters manuels :
class User
{
public string $name {
set(string $value) => trim($value);
}
}
Combinés à la visibilité asymétrique, on peut exposer une propriété en lecture publique mais en écriture protégée, sans passer par une méthode dédiée :
class Order
{
public private(set) string $status = 'pending';
}
Nouvelles fonctions utiles
json_validate()(8.3) : vérifie qu'une chaîne est un JSON valide sans le décoder entièrement, économisant de la mémoire pour les gros payloads.array_find(),array_any(),array_all()(8.4) : évitent les boucles manuelles pour des recherches ou vérifications sur un tableau.- Nouvelle classe
DateTime::createFromTimestamp()(8.3) pour construire une date directement depuis un timestamp, y compris avec microsecondes.
Ces évolutions poussent PHP vers un style plus déclaratif : moins de constructeurs verbeux, moins d'accesseurs manuels, et des garanties de type plus fines à la compilation plutôt qu'à l'exécution.