Journal

Les nouveautés incontournables de PHP 8.2 et 8.3

Journal du lundi 24 août 2026, généré le 24 août à 09:52

Classes en lecture seule et propriétés typées

PHP 8.2 introduit les classes readonly, une extension logique des propriétés readonly apparues en 8.1. Plutôt que de marquer chaque propriété individuellement, on déclare la classe entière immuable après construction.

final class Money implements Stringable
{
    public function __construct(
        public readonly int $amount,
        public readonly string $currency = 'EUR',
    ) {}

    public function __toString(): string
    {
        return sprintf('%.2f %s', $this->amount / 100, $this->currency);
    }
}

$prix = new Money(1999);
// $prix->amount = 2500; // Error: Cannot modify readonly property

Toute tentative de mutation après l'instanciation lève une Error, ce qui garantit l'immuabilité au niveau du moteur plutôt que par convention.

Types disjonctifs purs (DNF types)

PHP 8.2 permet de combiner types d'intersection et types d'union dans une même signature, grâce aux Disjunctive Normal Form types :

function traiter((Countable&Iterator)|null $collection): void
{
    // ...
}

Cela évite de recourir à des interfaces intermédiaires artificielles quand une valeur doit soit respecter plusieurs contrats, soit être null.

Constantes dans les traits et enums en lecture seule

PHP 8.2 autorise enfin les constantes de classe dans les traits, utiles pour partager des valeurs de configuration entre plusieurs classes sans passer par une interface :

trait HasStatus
{
    public const STATUS_ACTIVE = 'active';
    public const STATUS_ARCHIVED = 'archived';
}

PHP 8.3 : les enums prennent des constantes typées et implémentent des interfaces plus finement

Avec PHP 8.3, les enums peuvent implémenter des constantes typées et l'attribut #[\Override] fait son apparition : il signale explicitement qu'une méthode redéfinit une méthode parente ou d'interface, et déclenche une erreur si ce n'est pas le cas — un filet de sécurité précieux lors de refactorings.

class ExportCsv extends AbstractExporter
{
    #[\Override]
    public function export(array $rows): string
    {
        // ...
    }
}

Dépréciations à surveiller

  • Les fonctions dynamiques appelant des méthodes statiques comme non-statiques (et inversement) sont dépréciées depuis PHP 8.2.
  • PHP 8.3 déprécie l'implémentation implicite de Stringable sans déclaration explicite dans certains contextes stricts, et resserre le typage des retours de json_decode côté erreurs.
  • La fonction utf8_encode()/utf8_decode() est dépréciée : privilégier l'extension mbstring ou iconv.

Performance

Chaque version continue d'améliorer la Just-In-Time compilation et réduit l'empreinte mémoire des tableaux et objets. Pour un projet en production, activer opcache.jit_buffer_size et profiler avant/après migration reste la seule façon fiable de mesurer le gain réel, très dépendant du profil applicatif (CPU-bound vs I/O-bound).