# Trait

> Bloc de méthodes réutilisables qu'on incorpore dans une ou plusieurs classes sans passer par l'héritage, pour partager du comportement commun.

- Auteur : Clément Hadrot
- Publié le : 2026-09-25
- Mis à jour le : 2026-09-25
- URL : https://wpmoderne.dev.wordpress-developpement.fr/lexique/trait-php/

PHP n'autorise qu'un seul parent par classe : impossible d'hériter à la fois d'une classe « Cacheable » et d'une classe « Journalisable ». Un trait contourne cette limite en offrant un ensemble de méthodes toutes prêtes qu'on peut « coller » dans n'importe quelle classe, un peu comme un module qu'on branche plutôt qu'une filiation qu'on hérite.

## Déclaration en PHP

Un trait se déclare avec le mot-clé `trait` et s'incorpore dans une classe avec `use` : `trait Journalisable { public function log(string $m) { error_log(static::class . ": $m"); } }`, puis `class Commande { use Journalisable; }`. Une même classe peut utiliser plusieurs traits à la fois.

## Dans WordPress

Le cœur historique n'utilise pas de traits, mais on les rencontre fréquemment dans des extensions modernes et des frameworks bâtis sur WordPress pour partager, par exemple, une logique commune de rendu de blocs Gutenberg entre plusieurs classes qui n'ont sinon aucun lien de parenté.

## Exemple

```
trait Singleton {
    private static ?self $instance = null;

    public static function instance(): self {
        return self::$instance ??= new self();
    }
}

class GestionnaireCache {
    use Singleton;
}
```

## Pièges fréquents

Si deux traits utilisés dans la même classe définissent une méthode du même nom, PHP déclenche une erreur fatale à moins de résoudre explicitement le conflit avec la clause `insteadof` ou de renommer l'une des méthodes avec `as`. Un trait ne peut pas non plus être instancié directement : il n'existe que rattaché à une classe, et il ne peut pas non plus étendre une classe ni implémenter d'interface à sa place, contrairement à ce que sa syntaxe proche d'une classe pourrait laisser croire.
