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 :
. 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é :
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é :
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.