Vous vous posez la question « Quand est-ce qu’il faut créer un trait ? », quels sont les avantages et les inconvénients ? Ou peut être vous ne savez tous simplement pas ce qu’est-ce un trait en PHP et dans ce cas je vous invite à lire un article que j’ai écris à ce sujet.
Pour moi, les rares fois où j’ai créer un trait c’était pour la création de widgets Elementor ou Prestashop. Par exemple, quand on veut créer un widget Elementor, celui-ci hérite déjà d’une classe, je n’ai pas particulièrement envie de faire une classe qui en hérite d’une autre puis d’une autre jusqu’à faire mon widget juste pour mettre en commun 2-3 méthodes, c’est là que le trait intervient et qui me permets justement de mettre en commun ces méthodes. En sommes, un trait revient à faire un copié-collé si on veut vulgariser son fonctionnement.
trait CarouselTrait
{
public function getScriptDepends()
{
return ['swiper'];
}
protected function registerCarouselSection(array $args = [])
{
// Reste du code pour afficher des options
// de configuration dans Elementor
}
}
Les avantages d'un trait en php
- Si vous souhaitez réutiliser du code entre plusieurs classes, l'utilisation d'un trait est une alternative à l'extension de la classe. Dans ce cas, le trait peut être la meilleure option car il ne fait pas partie de la hiérarchie des types, c'est-à-dire qu'une classe qui utilise un trait n'est pas "une instance de ce trait".
- Un trait peut vous épargner un copier/coller manuel en proposant un copier/coller à la compilation.
Les inconvégnants d'un trait en php
D’un autre côté, les traits posent plusieurs problèmes. Par exemple :
- Lorsqu'un trait ajoute une ou plusieurs méthodes publiques à une classe, il est souvent nécessaire de définir ces méthodes comme une interface que la classe implémentera automatiquement en utilisant le trait. C'est impossible. Un trait ne peut pas implémenter une interface. Vous devez donc utiliser le trait et implémenter l'interface explicitement si vous voulez y parvenir.
- Les traits n'ont pas de méthodes et de propriétés "privées" qui leur sont propres. J'aime souvent cacher certaines choses à la classe dans laquelle le trait est utilisé, mais il est impossible de rendre les choses "privées". Tout ce qui est défini comme privé dans le trait sera toujours accessible par la classe dans laquelle le trait est utilisé. Il est donc impossible pour un trait d'encapsuler quoi que ce soit.
Quels sont les alternatives aux traits en PHP
Quoi qu’il en soit, dans la pratique, on trouve toujours des alternatives pour utiliser un trait. A titre d’exemple, voici quelques alternatives :
- Si le trait a des responsabilités de service, il est préférable de le transformer en un service réel, qui peut et doit être injecté comme argument de constructeur dans le service qui requiert ce service. C'est ce qu'on appelle un comportement composable ( ou composing behavior ) au lieu d'hériter d'un comportement. Cette approche peut également être utilisée lorsque vous souhaitez vous débarrasser des classes mères.
- Si le trait ajoute un comportement à une entité qui est le même pour une autre entité, il est souvent judicieux d'introduire un value object en php et de l'utiliser à la place.
Conclusion
Les traits sont pour moi une solution de facilité, c’est plus un moyens d’organiser son code au lieu de dupliquer des lignes de codes ou d’imbriquer des héritages les un dans les autres.