Différence entre un Trait et une classe abstraite en PHP

je suis tombé récemment sur Traits en PHP et j'essaie de les comprendre. Au cours de mes recherches, je suis tombé sur cette question de débordement de pile: Traits vs. Interfaces . La réponse acceptée mentionne ce qui suit:

une interface définit un ensemble de méthodes que la classe d'exécution doit mettre.

quand un trait est utilisé les implémentations des méthodes viennent le long aussi-ce qui n'arrive pas dans une Interface.

jusqu'ici si bon, mais cela ressemble exactement comme la différence entre une interface et une classe abstraite pour moi. Donc cela soulève une question de suivi pour moi:

  • Quelle est la différence entre un Trait et une classe abstraite en PHP?

je suis conscient que je peux étendre à partir d'une seule classe abstraite et d'autre part d'utiliser n'importe quel montant de traits. Mais est-ce vraiment la seule différence? Je ne comprends toujours pas tout à fait les traits et leur utilisation.

20
demandé sur Zoe 2016-09-13 12:25:55

2 réponses

les Traits vous permettent de partager le code entre vos classes sans vous forcer dans une hiérarchie de classe spécifique . Dites que vous voulez que toutes vos classes aient la méthode d'utilité commode foo($bar) ; sans traits vous avez deux choix:

  • l'implémenter individuellement avec redondance de code dans chaque classe
  • hérite d'une classe d'ancêtre commune (abstraite)

les deux solutions ne sont pas idéales, chacun avec leurs compromis différents. La redondance du Code est évidemment indésirable, et le fait d'hériter d'un ancêtre commun rend la conception de votre hiérarchie de classe inflexible.

Traits résoudre ce problème en vous permettant de mettre en œuvre foo($bar) dans un trait que chaque classe peut "importer" individuellement, tout en vous permettant de concevoir votre hiérarchie de classe en fonction des exigences de la logique d'Affaires, pas les nécessités de la langue.

27
répondu deceze 2016-09-13 09:32:33

pas exactement... Citons la documentation officielle à cet effet:

un Trait est similaire à une classe, mais destiné uniquement à grouper fonctionnalité d'une manière fine et cohérente. Il n'est pas possible pour instancier un Trait sur son propre. C'est un plus de la traditionnelle héritage et permet la composition horizontale des comportements, c'est, la demande de membres de la classe sans besoin d'héritage.

ainsi les Traits sont utilisés à des fins de composition pour permettre à la classe d'effectuer une certaine logique/comportement. Si vous héritez d'une autre/classe abstraite, c'est généralement dans un but de polymorphisme et vous obtenez un héritage distinct / hiérarchie de classe, ce qui peut être ou non souhaitable.

je pense que tout dépend du contexte, sur l'architecture et sur exactement ce que vous essayez de faire.

5
répondu walther 2016-09-13 09:35:18