Un trait est une sous-classe abstraite, un modèle conceptuel pour structurer des programmes orientés objets.
C'est un ensemble de méthodes concrètes ou fonctions, pouvant être ajouté à une classe pour étendre ses fonctionnalités.
Quand un langage de programmation supporte les traits, il permet la résolution explicite des conflits qui apparaissent quand une classe utilise deux traits qui ont des méthodes qui portent le même nom (contrairement aux mixins).
Les traits ne sont pas des types abstraits car ils ne capturent pas l'essence de l'objet mais celle de ses propriétés et méthodes,.
Par ailleurs, les « mixins de module » de Ruby sont comparables aux traits dans une certaine mesure. De même, le rôle en Perl 6 est une fonctionnalité inspirée du concept de trait.
L'exemple d'utilisation suivant en PHP montre une meilleure granularité des traits en comparaison d'un héritage multiple :
trait Hello {
public function sayHello() {
echo 'Hello ';
}
}
trait World {
public function sayWorld() {
echo ' World';
}
}
class MyHelloWorld {
use Hello, World;
public function sayExclamationMark() {
echo '!';
}
}
$o = new MyHelloWorld();
$o->sayHello();
$o->sayWorld();
$o->sayExclamationMark();