Maison >titres >Explication détaillée et application de Trait en php

Explication détaillée et application de Trait en php

小云云
小云云original
2017-11-04 09:40:281866parcourir

1. Héritage VS Polymorphisme VS Trait

Il existe désormais deux classes : Publish.php et Answer.php. Pour y ajouter la fonction LOG, enregistrez les actions à l'intérieur de la classe. Il existe plusieurs options :

Hériter du trait polymorphe 1.1. Hériter

comme indiqué sur la figure :

Explication détaillée et application de Trait en php

. code La structure est la suivante :

// Log.php

Vous pouvez voir que l'héritage répond effectivement aux exigences. Mais cela viole le principe orienté objet. La relation entre les opérations telles que Publier, Répondre et Journaliser n'est pas la relation entre la sous-classe et la classe parent. Il n’est donc pas recommandé de l’utiliser de cette façon.

1.2. Polymorphisme

Comme indiqué :

Explication détaillée et application de Trait en php

Code d'implémentation :

// Log.php

Les opérations de journalisation doivent être les mêmes, donc l'implémentation de la journalisation dans les actions Publier et Répondre est également la même. Évidemment, cela viole le principe DRY (Don’t Repeat Yourself). Il n’est donc pas recommandé de le mettre en œuvre de cette manière.

1.3. Trait

comme indiqué :

Explication détaillée et application de Trait en php

Le code d'implémentation est le suivant suit :

// Log.php endLog(); // Answer.php startLog(); $answer->endLog();

Comme vous pouvez le constater, nous avons réalisé le code sans augmenter la complexité de le code.

1.4.Conclusion

Bien que la méthode d'héritage puisse également résoudre le problème, son idée viole le principe orienté objet et semble très grossière, la méthode polymorphe est également réalisable, mais ce n'est pas le cas ; en ligne avec le processus de développement logiciel. Le principe DRY augmente les coûts de maintenance. La méthode Trait évite les défauts ci-dessus et permet de réutiliser le code de manière relativement élégante.

2. Portée du Trait

Après avoir compris les avantages du Trait, nous devons également comprendre les règles de sa mise en œuvre. Parlons d'abord de la portée. C'est plus facile à prouver. Le code d'implémentation est le suivant :

publicF(); (); $ this->privateF(); } } $publish = new Publish(); $publish->doPublish();

Le résultat de l'exécution du code ci-dessus est le suivant :

fonction publique fonction protégée fonction privée

Vous pouvez constater que la portée de Trait est visible à l'intérieur de la classe Trait qui y fait référence. On peut comprendre que le mot-clé use copie le code d'implémentation du Trait dans la classe qui référence le Trait.

3. Priorité des attributs dans Trait

En ce qui concerne la priorité, il doit y avoir un objet de référence pour la comparaison. L'objet de référence fait ici référence à la classe Trait et à sa classe parent.

Utilisez le code suivant pour prouver la priorité des attributs dans l'application Trait :

publicF(); >protectF(); } } $publish = new Publish(); $publish->doPublish();

La sortie du code ci-dessus est la suivante :

Publish : publicF public function Log::protectF protected function

Grâce à l'exemple ci-dessus, les priorités dans les applications Trait peuvent être résumées comme suit :

Les membres de la classe actuelle remplacent la méthode du trait et le Le trait remplace celui hérité. La priorité du membre de classe de la méthode

est : la classe actuelle>Trait> la classe parent

4 au lieu des mots-clés

peuvent référencer plusieurs traits dans une classe. , comme suit :

startLog(); ; paramètreCheck($para); $this->endLog(); } >

Grâce à la méthode ci-dessus, nous pouvons référencer plusieurs traits dans une classe. Lors du référencement de plusieurs traits, il est facile de causer des problèmes. Le problème le plus courant est que faire s'il existe des propriétés ou des méthodes portant le même nom dans deux traits. À ce stade, vous devez utiliser les mots-clés au lieu de et as. le code d'implémentation suivant :

startLog(); ); $this->csl(); } } $publish = new Publish(); $publish->doPublish();

Exécutez le code ci-dessus, le résultat de sortie est le suivant :

Log: :startLog fonction publique Check::parameterCheck paramètre checkparams Check::startLog fonction publique

Tout comme le sens littéral, le mot-clé placeof remplace ce dernier par le premier, et le mot-clé as donne un alias à la méthode remplacée.

Lorsque vous faites référence à Trait, le mot-clé use est également utilisé pour faire référence à l'espace de noms. La différence entre les deux est que lors de la référence à Trait, il est utilisé à l'intérieur de la classe.


Déclaration:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn