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.