Maison >développement back-end >tutoriel php >Explication détaillée de la différence entre l'utilisation de la définition de trait et l'interface en PHP
Depuis PHP5.4.0, PHP a implémenté une méthode de réutilisation de code appelée Trait. Parce que PHP est un seul héritage, lorsque vous avez besoin de plusieurs fonctionnalités différentes, vous devez combiner plusieurs classes de base. L'émergence de Trait évite ces problèmes. L'avantage de Trait est qu'il peut être combiné à volonté, et. le code Effacer. Cet article présente principalement des traits en PHP. Les amis dans le besoin peuvent s'y référer.
Avant-propos
Un ancien collègue a changé de travail et a été interrogé sur les caractéristiques PHP lors de l'entretien. Je ne l'ai jamais utilisé auparavant, donc je n'y ai pas bien répondu. Je l'ai probablement utilisé plusieurs fois, alors j'y ai réfléchi et j'ai compilé le résumé suivant.
trait
le trait est un attribut ou une méthode spécifique que certaines classes (Classe) devraient avoir, tandis que d'autres classes du même niveau parent devraient évitez d'utiliser ces attributs et méthodes
Bien sûr, cela est également lié à la capacité du développeur à abstraire la classe. Certaines capacités abstraites sont bonnes, ce qui peut réduire le besoin de traits. , cette situation devrait être inévitable, sinon l'émergence de traits n'aura aucun sens.
Il existe une autre situation, c'est-à-dire que lors de l'utilisation de traits, il peut contraindre les développeurs Sa fonction est de rappeler les développeurs doivent faire attention à certains attributs et méthodes de traits qui doivent être appelés pendant le processus de développement.
Un collègue a soulevé une bonne question, l'interface n'a-t-elle pas également cette fonction ?
Pas de précipitation, regardons d'abord un exemple :
Par exemple, si vous souhaitez collecter diverses données sur le site web, vous avez développé la classe Spider . Spider
et il existe une méthode appelé request()
qui est responsable de la demande
<?php namespace XWSoul\Network; class Spider { public function request($url) { //do sth. } }
Cependant, lors du processus de collecte de données, certains sites Web sont sensibles aux araignées et d'autres ne le sont pas. Pour les sites Web sensibles, nous avons proposé une solution en utilisant. un proxy. Cependant, l'utilisation d'un proxy affectera la vitesse d'exploration. Cela conduit à la situation où certaines sous-classes de Spider doivent utiliser des proxys et essayez de ne pas utiliser de proxys si possible.
Donc, pour le moment, nous ajout d'un nouveau trait Proxy :
<?php namespace XWSoul\Network; trait Proxy { protected $isProxy = false; public function useProxy($proxy) { //do sth proxy setups. $this->isProxy = true; return $this; } public function request($url) { if (!$this->isProxy) { throw new Exception("Please using proxy."); } //do sth. return parent::request($url); } }
Trait réécrit la méthode request()
de Spider, en limitant le fait que l'appeler sans appeler un proxy lèvera une exception
Retour à la question précédente, le trait est comme ça Quelle est la différence entre l'utilisation et l'interface
Les contraintes de l'interface sont prédéfinies et doivent être implémentées au début de la définition. L'implémentation des méthodes mais ne peut pas contraindre l'invocation des méthodes. Le trait est une sorte de post-appel, il a implémenté la méthode, la clé est qu'elle n'impose que des contraintes à la classe qui s'appelle (une phrase absurde), et n'en a pas. effet sur la classe qui ne s'appelle pas (une phrase absurde encore). En même temps, elle est réutilisable et ne détruit pas l'implémentation de la classe Spider elle-même. Spider est toujours la même Spider.Plus tard
Quelqu'un peut décider d'implémenter une autre requête, par exemple, proxyRequst. N'est-ce pas la fin ? Ce que vous avez dit a du sens... mais que se passe-t-il si j'utilise un proxy différent et les détails de ? les requêtes sont différentes ? Est-ce que je n'arrête pas de dire if if if dans le code ? Pourquoi devrais-je abandonner une solution aussi rafraîchissante comme trait
Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!