Article mis à jour le : 05-05-2022
Quelques notions sur les traits en PHPEn PHP, il existe un concept appelé "les traits".
Concrètement, ils s'agit de mini-classes qui ont pour but de factoriser du code, plus précisément d'éviter la duplication de code. Ces traits sont inclus dans vos classes, qui peuvent en utiliser un nombre illimité, avec possibilité de définir une priorité d'un trait par rapport à l'autre. De plus, un trait peut lui-même appeler un autre trait.
Mais voyons un exemple, simple...
Soit deux classes qui utilise un code pour additionner deux valeurs. Ce code est identique dans chacun d'entre elles, ce qui signifie qu'il est dupliqué, et qu'en cas de mise à jour, il devra être modifié x fois. Pour éviter cela, nous pouvons utiliser un trait:
Comme vous pouvez le constater, l'instanciation de la classe classeA et l'appel de la fonction maFonction, permet d'utiliser ainsi ce code factorisé grâce à l'inclusion du trait.
Pour appeler plusieurs traits :
use traitA, traitB;
En cas de conflit (méthode ayant le même nom dans deux traits inclus), on peut utiliser un système de priorité. Admettons que traitA et traitB aient tous deux une méthode appelée "theFonction"; Nous souhaitons que traitA soit prioritaire, alors à l'inclusion, il faudra inscrire :
Autres priorités, mais entre classe et trait cette fois. En cas de méthode au nom identique, celle de la classe l'emporte. Il y a cependant un piège pour l'héritage. Admettons que la classe B, qui inclue le trait "monTrait", hérite de la classe A, et que monTrait et la classe A aient une méthode avec le même nom. Dans ce cas, le trait est prioritaire, par rapport à la classe mère.
Les traits peuvent aussi avoir des attributs. En cas de conflit, la règle est un peu différente : si la classe qui inclue le trait tente d'implémenter une variable au nom identique qu'une variable du trait, alors ce ne sera pas possible... Vous aurez droit à une erreur (attention à ca d'ailleurs, car elles ne sont pas toujours toutes affichées selon les configuration des serveurs...).
A la manière des classes, un trait peut appeler un trait. Il suffit d'utiliser également le mot-clef "use".