Les Traits en PHP – tout des exemples du monde réel et de pratiques exemplaires?
Traits ont été l'un des plus grands ajouts pour PHP 5.4. Je sais que la syntaxe et de comprendre l'idée derrière les traits, comme horizontale code re-utiliser pour le commun des trucs comme l'exploitation forestière, la sécurité, la mise en cache etc.
Cependant, je ne sais toujours pas comment je pourrais utiliser des traits dans mes projets.
Existe-il des projets open source qui utilisent déjà les traits? Tout de bons articles/matériel de lecture sur la façon de structurer les architectures à l'aide de traits?
- Voici mon avis: un blog sur le sujet que j'ai écrit sur le sujet. TL;DR: en gros, j'ai peur que pendant qu'ils sont puissant et peut être utilisé pour de bon, la majorité des utilisations, nous allons voir vont être complet anti-modèles et provoquer beaucoup plus de douleur qu'ils n'en résolvent...
- Jetez un oeil à scala de la bibliothèque standard et vous trouverez de nombreux exemples de traits de caractère.
Vous devez vous connecter pour publier un commentaire.
Mon opinion personnelle est qu'il y a en fait très peu de demande pour des caractères lors de l'écriture de code propre.
Au lieu d'utiliser des traits de hack code dans une classe, il est mieux de passer dans les dépendances via le constructeur ou par l'intermédiaire de setters:
La principale raison pour laquelle je trouve que c'est mieux que l'aide de traits, c'est que votre code est beaucoup plus souple en retrait de la dur de couplage à un trait. Par exemple, vous pouvez tout simplement passer à un autre enregistreur de classe. Cela rend votre code réutilisable et testable.
Je pense qu'on serait à rechercher dans les langues qui ont des Traits pour un certain temps maintenant d'apprendre les Bonnes/Meilleures pratiques. Mon opinion sur le Trait est que vous ne devriez les utiliser pour le code que vous devez dupliquer dans d'autres classes que de partager la même fonctionnalité.
Exemple pour un Enregistreur de trait:
Et puis vous n' (démo)
Je suppose que la chose importante à considérer lors de l'utilisation de traits, c'est qu'ils sont vraiment juste des morceaux de code qui sont copiés dans la classe. Cela peut facilement conduire à des conflits, par exemple, lorsque vous essayez de modifier la visibilité des méthodes, par exemple,
Ci-dessus entraînera une erreur (démo). De même, toutes les méthodes déclarées dans le trait qui le sont déjà déclarés dans l'utilisation de la classe ne sera pas copiée dans la classe, par exemple
imprime 2 (démo). Ce sont des choses que vous voulez éviter, car ils font des erreurs difficiles à trouver. Vous voulez aussi éviter de mettre des choses en traits qui opèrent sur des propriétés et des méthodes de la classe qui l'utilise, par exemple,
œuvres (démo) mais maintenant, le trait est intimement liée à l'Un et à l'ensemble de l'idée à l'horizontale réutilisation est perdu.
Lorsque vous suivez les L'Interface De La Ségrégation Principe, vous aurez de nombreuses petites classes et d'interfaces. Qui rend les Traits d'un candidat idéal pour les choses que vous avez mentionnées, par exemple problèmes intersectoriels, mais pas de composer des objets (dans un structurelle sens). Dans notre Enregistreur exemple ci-dessus, le trait est complètement isolé. Il n'a pas de dépendances sur les classes de béton.
Nous pourrions utiliser agrégation/composition (comme on l'a montré ailleurs sur cette page) pour atteindre la même classe, mais l'inconvénient de l'utilisation de l'agrégation/composition, c'est que nous devrons ajouter le proxy/délégataire méthodes manuellement à chaque classe alors que ce devrait être en mesure de se connecter. Les Traits de résoudre ce bien en me permettant de garder le standard en un seul endroit et de manière sélective l'appliquer en cas de besoin.
Remarque: étant donné que les traits sont un nouveau concept en PHP, toute opinion exprimée ci-dessus est sujette à changement. J'ai pas eu beaucoup de temps pour évaluer le concept de moi-même encore. Mais j'espère qu'il est assez bon pour vous donner quelque chose à penser.
demoLogger
de se connecté avecLogger
🙁demoLogger
n'est pas en s'appuyant sur tout l'extérieur de la classe pour gérer les logs. Il a juste fait l'écho d'un message lorsqu'il se connecte. Comme @Gordon a expliqué, de son aire d'originelog()
fonction ne sera pas sur-écrite par le trait qu'elle utilise. Donc, je pense que c'est juste destiné à servir comme un exemple d'une classe implémentant l'Logger
interface sans l'utilisation de traits.$foo->getLogger()->log()
, Maintenant je peux le faire$foo->log()
et dans le même temps, gardez à l'aide de la composition. Super !🙂 Je n'aime pas à théoriser et de débat sur ce qui doit être fait avec quelque chose. Dans ce cas, les traits. Je vais vous montrer ce que je trouve traits utiles et vous pouvez apprendre de lui, ou de l'ignorer.
Traits - ils sont parfaits pour appliquer stratégies. Stratégie de modèles de conception, en bref, sont utiles lorsque vous souhaitez les mêmes données à manipuler (de filtrer, trier, etc) de façon différente.
Par exemple, vous avez une liste de produits que vous souhaitez filtrer en fonction de certains critères (les marques, les spécifications, peu importe), ou triés par différents moyens (prix, étiquette, peu importe). Vous pouvez créer un tri trait de caractère qui contient des fonctions différentes pour les différents types de tri (numérique, chaîne, date, etc). Vous pouvez ensuite utiliser ce trait non seulement dans votre classe de produit (comme dans l'exemple), mais également dans d'autres classes qui ont besoin de stratégies similaires (pour appliquer un tri numérique à certaines données, etc).
Essayer:
Comme une clôture note, je pense que sur des traits comme accessoires (ce que je peux utiliser pour modifier mes données). Les mêmes méthodes et des propriétés qui peut se couper de mes cours et les mettre en un seul endroit, pour un entretien facile, plus courte et plus propre code.
strategies
.Je suis très heureux pour les Traits, car ils résoudre un question commune lors de l'élaboration des extensions de la plateforme de commerce électronique Magento. Le problème se produit lorsque les extensions d'ajouter des fonctionnalités à une classe de base (comme par exemple le modèle de l'Utilisateur) en l'élargissant. Ceci est fait en pointant le Zend autochargeur (via un fichier de configuration XML) pour utiliser le modèle de l'Utilisateur de l'extension, et ont de ce nouveau modèle d'étendre le modèle de base. (exemple) Mais si deux extensions de remplacer le même modèle? Vous obtenez une "race condition" et que l'on est chargé.
La solution actuelle est de modifier les extensions si on étend l'autre modèle de remplacer classe dans une chaîne, puis définissez la configuration d'extension pour les charger dans le bon ordre, donc l'héritage de la chaîne d'œuvres.
Ce système provoque souvent des erreurs, et lors de l'installation de nouvelles extensions, il est nécessaire de vérifier les conflits et modifier les extensions. C'est une douleur, et rompt le processus de mise à niveau.
Je pense à l'aide de Traits serait un bon moyen de faire la même chose sans cette fâcheuse modèle de remplacer la "race condition". Accordée, il pourrait encore y avoir des conflits si plusieurs Traits de mettre en œuvre des méthodes avec le même nom, mais j'imagine quelque chose comme un simple espace de noms de la convention pourrait régler ce, pour la plupart.
TL;DR je pense que les Traits pourraient être utiles pour la création d'extensions/modules/plugins pour les grandes PHP progiciels comme Magento.
Vous pourriez avoir un trait de lecture seule de l'objet comme ceci:
Vous pourriez détecter si ce trait de caractère est utilisé et de déterminer si ou non vous devriez écrire cet objet dans une base de données, fichier, etc.
use
ce trait serait alors appelif($this -> getReadonly($value))
; mais ce serait de générer une erreur si vous n'avez pasuse
ce trait de caractère. A cet effet cette exemple est défectueux.