# PHP 8.4 et les propriétés à visibilité asymétrique pour sécuriser un bloc

> PHP 8.4 introduit les propriétés à visibilité asymétrique. Voici comment ce mécanisme sécurise l'état interne d'une classe de bloc complexe sans multiplier les accesseurs.

- Auteur : Clément Hadrot
- Publié le : 2026-03-01
- Mis à jour le : 2026-03-01
- Catégorie : Blocs Gutenberg
- URL : https://wpmoderne.dev.wordpress-developpement.fr/blocs/php-8-4-proprietes-visibilite-asymetrique-bloc/

## L’essentiel

- private(set) protège l'écriture tout en gardant la lecture publique
- Fini les paires get/set écrites uniquement pour interdire la modification externe
- Le typage strict de la propriété reste inchangé, seule la visibilité change

« Une classe ne devrait exposer en écriture que ce qu'elle veut bien laisser modifier de l'extérieur » — un principe de conception ancien, que PHP obligeait jusqu'ici à implémenter à coup d'accesseurs privés et de méthodes `getXxx()` écrites dans le seul but d'empêcher une modification externe. PHP 8.4, sorti en novembre 2024, referme enfin cet écart avec les propriétés à visibilité asymétrique.

Sur une classe de bloc complexe gérant l'état d'un configurateur de devis multi-étapes, ce mécanisme a permis de supprimer une douzaine de méthodes d'accès qui n'existaient que pour interdire une écriture externe non désirée — sans jamais ajouter la moindre logique métier.

## Le problème que ce mécanisme résout

Avant PHP 8.4, protéger une propriété en écriture tout en la gardant lisible de l'extérieur imposait de la déclarer `private` et d'écrire un accesseur public dédié :

```
class ConfigurateurDevis {
    private int $etapeCourante = 1;

    public function getEtapeCourante(): int {
        return $this->etapeCourante;
    }

    private function avancerEtape(): void {
        $this->etapeCourante++;
    }
}
```

Cette méthode `getEtapeCourante()` ne fait strictement rien d'autre que retourner la valeur brute : elle existe uniquement pour contourner l'absence de granularité entre lecture et écriture dans la visibilité classique de PHP.

## La syntaxe des propriétés à visibilité asymétrique

> L'essentiel à retenir : private(set) protège l'écriture tout en gardant la lecture publique ; Fini les paires get/set écrites uniquement pour interdire la modification externe ; Le typage strict de la propriété reste inchangé, seule la visibilité change

PHP 8.4 permet de déclarer une visibilité distincte pour la lecture et pour l'écriture d'une même propriété, avec le mot-clé `private(set)` ou `protected(set)` associé à une visibilité de lecture différente :

```
class ConfigurateurDevis {
    public private(set) int $etapeCourante = 1;

    public function avancerEtape(): void {
        $this->etapeCourante++;
    }
}

$configurateur = new ConfigurateurDevis();
echo $configurateur->etapeCourante; // lecture publique : autorisée
$configurateur->etapeCourante = 5;  // écriture externe : erreur fatale
```

La propriété reste lisible publiquement, comme n'importe quelle propriété `public` classique, mais toute tentative d'écriture depuis l'extérieur de la classe déclenche une erreur, sans qu'aucun accesseur n'ait eu à être écrit pour l'empêcher.

## Appliqué à une classe de bloc complexe

Sur un bloc de configurateur de devis à cinq étapes, plusieurs propriétés bénéficient directement de ce mécanisme : l'étape courante, le total calculé, et la liste des options sélectionnées ne doivent jamais être modifiées directement depuis le rendu du bloc, seulement à travers les méthodes métier dédiées :

```
final class ConfigurateurDevisBlock {
    public private(set) int $etapeCourante = 1;
    public private(set) float $totalEstime = 0.0;
    public private(set) array $optionsChoisies = [];

    public function selectionnerOption( string $optionId, float $prix ): void {
        $this->optionsChoisies[ $optionId ] = $prix;
        $this->totalEstime = array_sum( $this->optionsChoisies );
    }
}
```

Le rendu du bloc, dans `render.php`, peut désormais lire ces trois propriétés directement — `$configurateur->totalEstime` — sans passer par un accesseur, tout en conservant la certitude qu'aucun code externe ne peut altérer ce total autrement qu'en appelant `selectionnerOption()`, seule méthode habilitée à le recalculer.

## Ce que ce mécanisme ne change pas

- Le typage de la propriété reste identique : `int`, `float`, `array` ou toute autre déclaration de type continuent de fonctionner exactement comme avant.
- Les propriétés en lecture `private` ou `protected` classiques restent utilisables sans changement, la visibilité asymétrique n'étant qu'une option supplémentaire, pas un remplacement obligatoire.
- Ce mécanisme ne remplace pas la validation métier : il empêche une écriture non désirée, pas une écriture invalide passée par la bonne méthode. Un contrôle de cohérence dans `selectionnerOption()` reste nécessaire si besoin.

> Une propriété `public private(set)` documente, dans la signature même de la classe, l'intention du développeur — bien plus explicite qu'un accesseur qui pourrait, en théorie, cacher n'importe quelle logique.

## Compatibilité et prérequis

Ce mécanisme n'existe qu'à partir de PHP 8.4, publié en novembre 2024 : un site hébergé sur une version antérieure de PHP ne peut pas en bénéficier, et une classe l'utilisant provoquerait une erreur de syntaxe fatale sur un environnement plus ancien. Avant de l'introduire dans un plugin ou un thème distribué publiquement, il convient de vérifier la version minimale de PHP annoncée dans son `readme`, faute de quoi une partie des utilisateurs se retrouverait avec un site en erreur au premier chargement.

## En résumé

Les propriétés à visibilité asymétrique de PHP 8.4 suppriment une contorsion de conception ancienne : écrire un accesseur uniquement pour interdire une modification externe. Sur une classe de bloc à l'état interne riche, comme un configurateur de devis multi-étapes, ce mécanisme rend le code plus court et son intention plus lisible, sans rien changer à la logique métier elle-même.
