PHP: quand utiliser des Traits et quand utiliser des méthodes statiques?

mes applications PHP utilisent généralement des classes pour namespacing. Les méthodes dans ces classes sont définies comme statiques.

maintenant que PHP a introduit des Traits de caractère, j'essaie de me concentrer sur le moment de les utiliser. J'ai vu quelques exemples d'utilisation de traits, mais je pense que cela pourrait tout aussi facilement être mis en œuvre par une méthode de classe statique.

voici un exemple assez complet utilisant un logger: Traits en PHP-tous les exemples du monde réel / best pratiques?

mais pourquoi utiliser un Trait, si vous pouvez aussi utiliser un Logger statique:: log ()? La seule chose à laquelle je pense, c'est un accès facile à $this. Un autre exemple auquel je fais face en ce moment, est une fonction existe-utilisateur. Le Trait, ou la méthode statique il?

quelqu'un Peut-il éclairer sur ce point?

13
demandé sur Community 2014-04-19 20:56:50

3 réponses

après avoir lu les commentaires sur la question, mon point de vue sur la réponse est le suivant:

Les Traits permettent l'extension d'une classe sans qu'elle fasse partie de la hiérarchie de classe. Il n'y a pas besoin de quelque chose comme class Book extends Loggable, comme le livre lui-même n'est pas un Loggable, nous voulons juste la fonctionnalité Loggable. La fonctionnalité dans le Loggable pourrait être fourrée dans un trait, donc être en mesure d'utiliser les méthodes Loggable dans le livre comme si vous vous étendiez à partir de lui.

Le l'avantage d'utiliser des traits au-dessus de l'utilisation de méthodes statiques au sein des classes (ou des fonctions avec un nom) est que le trait a accès à la portée complète de la classe, y compris les membres privés.

l'inconvénient de l'utilisation de fonctions statiques au lieu de traits, est le couplage serré (dépendances) entre les classes, ce qui nuit à la réutilisabilité et peut nuire aux tests unitaires (par exemple en utilisant des services de simulation). Les dépendances doivent être injectées à l'exécution, ce qui augmente en effet l'effort d'instanciation d'un classe/méthode, mais de permettre une meilleure flexibilité sur l'ensemble de l'application. C'était une idée nouvelle pour moi.

13
répondu Greggg 2014-04-21 07:53:48

j'utilise des traits seulement pour des méthodes d'aide simples [une-liners] (validations regexp de chaîne, normalisateurs de chaîne, générateurs de nombres primitifs) dont j'ai besoin souvent dans plusieurs classes.

quand il n'y avait pas de traits, j'ai utilisé des méthodes publiques statiques - avec des traits, il est possible de les Définir comme des méthodes privées normales, aussi.

ou vous pouvez utiliser des traits pour définir des fonctions basiques fictives en combinaison avec des classes avec des interfaces pour être sûr, chaque méthode exister.

l'avantage des traits est que vous pouvez utiliser les mêmes méthodes dans plusieurs classes, et pour les petits changements vous n'avez pas à réécrire les mêmes méthodes dans toutes les classes. Les Traits sont juste des timesavers. ;)

et btw.. spl_autoload_register peut gérer le chargement de caractère fichiers, trop. ;)

0
répondu SammieFox 2018-03-28 08:51:55

les Traits peuvent accéder aux membres privés des objets.

-4
répondu Tomas 2014-04-19 17:51:23