L’héritage simple en PHP permet une spécialisation des classes au fur et à mesure de leur héritage. C’est ce qu’on peut appeler l’injection verticale de comportement.

Or une classe ne pouvant hériter que d’une classe et une seule, il est souvent nécessaire de dupliquer un code dans plusieurs classes qui nécessitent cette fonctionnalité précise.

C’est là qu’interviennent les traits, introduits depuis PHP 5.4.0, permettant l’injection multiple de comportement sans nécessiter d’héritage. On parle alors de composition horizontale de comportement

Un trait est très semblable à une classe et possède à peu près les mêmes attributs hormis le fait qu’on ne peut ni les instancier, ni y définir de constantes, ni implémenter d’interface

  1. Déclaration d’un trait 

La déclaration d’un trait se fait à l’aide du mot-clé trait : trait MonTrait {}

  1. Utilisation d’un trait 

Une classe utilise un trait à l’aide du mot-clé use. Elle peut utiliser un ou plusieurs traits en les séparant par des virgules.

Class NomClass {
  use nom-trait [, nom-trait...];
}

Exemple d’utilisation :

<?php //Enter your code here, enjoy! 
trait MonTrait { 
   public function qui() {
        echo __CLASS__; 
   } 
} 
class Test { 
  use MonTrait; 
} 
$objet = new Test(); $objet->qui();
// L'exécution de ce code donne le résutat Test
  1. Attributs et méthodes

Le comportement représenté par un trait peut être composé d’attributs (statiques ou non), de méthodes (statiques ou non) et de méthodes abstraites.

Un trait est donc capable de fournir un comportement et d’imposer aux classes l’utilisant l’implémentation de certaines méthodes

<?php //Enter your code here, enjoy! 
trait MonTrait { 
  public $a = 5; 
  public static $b = 10; 
} 
class Test {
  use MonTrait; 
} 
$objet = new Test(); 
echo $objet->a; // Affiche 5
echo Test::$b; // Affiche 10
// Une classe ne peut pas définir un attribut du même nom qu'un 
// attribut d'un trait qu'elle utilise
<?php //Enter your code here, enjoy! 
trait MonTrait {
   abstract public function test1(); 
} 
class Test { 
   use MonTrait;
public function test1() { 
  echo "test method abstract"; 
  } 
} 
$objet = new Test(); 
$objet->test1(); // Affiche "test method abstract"