Maison  >  Article  >  développement back-end  >  Explication détaillée de la façon d'utiliser Trait pour résoudre un problème d'héritage unique en PHP

Explication détaillée de la façon d'utiliser Trait pour résoudre un problème d'héritage unique en PHP

青灯夜游
青灯夜游avant
2022-03-01 10:56:554145parcourir

Comment briser la malédiction de l'héritage unique en PHP ? L'article suivant vous présentera comment utiliser Trait pour résoudre le problème d'héritage unique en PHP. J'espère qu'il vous sera utile.

Explication détaillée de la façon d'utiliser Trait pour résoudre un problème d'héritage unique en PHP

Nous savons tous que PHP est un langage à héritage unique, mais parfois nos deux classes qui n'ont rien à voir avec les affaires peuvent avoir des comportements similaires. Comment pouvons-nous réaliser avec élégance DRY (Don't Repeat Yourself) ?

La réponse est d'introduire TraitTrait

Trait简介

Trait是PHP 5.4引入的新概念,看上去既像类又像接口。【推荐学习:《PHP视频教程》】

其实都不是,Trait可以看做类的部分实现,可以混入一个或多个现有的PHP类中。

Trait是一种代码复用技术,为PHP的单继承限制提供了一套灵活的代码复用机制。

Trait作用

  • 表明类可以做什么;

  • 提供模块化实现。

单继承结构

开篇我就提到了PHP是单继承语言,我们通常的习惯是:

  • 先编写一个通用的基类,实现基本的功能,进行通用逻辑的封装,然后扩展这个基类;

  • 然后再创建更具体的子类,直接从父类继承实现。

这叫方式就是单继承层次结构,很多编程语言都使用这个模式。

大多数时候这种典型的继承模型能够良好运作,但是如果想让两个无关的PHP类具有类似的行为,应该怎么做呢?

示例源码

我查询了Laravel的源码,以自带的LoginController为例,其中的登录认证就是通过Trait实现:

Explication détaillée de la façon dutiliser Trait pour résoudre un problème dhéritage unique en PHP

创建Trait

创建Trait很简单,跟创建类有点类似,只不过使用的关键字是trait而不是class,以上述的AuthenticatesUsers为例:

Explication détaillée de la façon dutiliser Trait pour résoudre un problème dhéritage unique en PHP

我们通过trait声明定义的是一个Trait,然后我们可以在这个Trait中像类一样定义要使用的属性和方法。

此外Trait支持嵌套和组合,即通过一个或多个Trait(多个用,分隔)组合成一个Trait,比如AuthenticatesUsers就是如此:

Explication détaillée de la façon dutiliser Trait pour résoudre un problème dhéritage unique en PHP

注意:Trait中还支持定义抽象方法和静态方法,其中抽象方法必须在使用它的类中实现。

调用方法的优先级:

调用类>Trait>父类(如果有的话),方法可以覆盖,但属性不行。

注意:如果Trait中定义了一个属性,如果调用类中也定义这个属性则会报错。

使用Trait

Trait的使用方法也很简单,上面的截图示例中已经显示的很清楚明了:使用use关键字。

引入位置

注意:命名空间和Trait使用的都是use关键字引入,不同之处在于导入位置,命名空间在类的定义体外导入,而Trait在类的定义体内导入

Explication détaillée de la façon dutiliser Trait pour résoudre un problème dhéritage unique en PHP

编译问题

如果Trait和引用Trait的类有相同的属性和方法,我们再外部调用时需要使用instansof

Introduction à Trait

Trait est un nouveau concept introduit dans PHP 5.4, qui ressemble à la fois à une classe et une interface. [Apprentissage recommandé : "Tutoriel vidéo PHP

"]

En fait, il n'est ni l'un ni l'autre, les Traits peuvent être considérés comme des implémentations partielles de classes qui peuvent être mélangées dans une ou plusieurs classes PHP existantes. Trait est une technologie de réutilisation de code qui fournit un mécanisme flexible de réutilisation de code pour la restriction d'héritage unique de PHP.

🎜Fonction Trait🎜
  • 🎜Indique le class Que peut-on faire ; 🎜
  • 🎜Fournir une implémentation modulaire. 🎜

Structure d'héritage unique

🎜J'ai mentionné au début que PHP est un langage d'héritage unique. Notre habitude habituelle est : 🎜
  • 🎜Écrivez d'abord une classe de base générale pour implémenter les fonctions de base, encapsulez la logique générale, puis étendez cette classe de base ;🎜
  • 🎜Créez ensuite une classe plus sous-classe spécifique qui hérite de l'implémentation directement de la classe parent. 🎜
🎜Cette méthode est appelée hiérarchie d'héritage unique, et de nombreux langages de programmation utilisent ce modèle. 🎜🎜Ce modèle d'héritage typique fonctionne bien la plupart du temps, mais que se passe-t-il si vous souhaitez que deux classes PHP non liées se comportent de la même manière ? 🎜

Exemple de code source

🎜J'ai vérifié le code source de Laravel, en prenant comme exemple le LoginController intégré. L'authentification de connexion est implémentée via Trait : 🎜🎜Explication détaillée de la façon dutiliser Trait pour résoudre un problème dhéritage unique en PHP🎜

Créer un trait h2>🎜 Créer un trait est très simple. C'est similaire à la création d'une classe, sauf que le mot-clé utilisé est trait au lieu de class ci-dessus. à titre d'exemple. :🎜🎜 Explication détaillée de la façon dutiliser Trait pour résoudre un problème dhéritage unique en PHP🎜🎜 Ce que nous définissons via la déclaration trait est un Trait, et nous pouvons ensuite définir les propriétés et les méthodes à utiliser dans ce Trait comme une classe. 🎜🎜De plus, les traits prennent en charge l'imbrication et la combinaison, c'est-à-dire qu'un ou plusieurs traits (plusieurs sont séparés par) sont combinés en un seul trait, tel que AuthenticatesUsers : 🎜🎜Explication détaillée de la façon dutiliser Trait pour résoudre un problème dhéritage unique en PHP🎜🎜Remarque : Trait prend également en charge les définitions Méthodes abstraites et méthodes statiques, où une méthode abstraite doit être implémentée dans la classe qui l'utilise. 🎜🎜Priorité de la méthode d'appel : 🎜🎜Classe d'appel>Trait>Classe parent (le cas échéant), méthodes peuvent être remplacés, mais pas les attributs. 🎜🎜Remarque : Si un attribut est défini dans Trait, une erreur sera signalée si cet attribut est également défini dans la classe appelante. 🎜

Utiliser Trait

🎜La méthode d'utilisation de Trait est également très simple L'exemple de capture d'écran ci-dessus l'a montré très clairement : utilisez useMots clés. 🎜<h2><strong>Emplacement d'introduction</strong></h2>🎜Remarque : les espaces de noms et les traits sont tous deux introduits à l'aide du mot-clé <code>use. La différence réside dans l'emplacement d'importation, Espaces de noms. sont importés en dehors de la définition de classe, tandis que les traits sont importés à l'intérieur de la définition de classe. 🎜🎜Explication détaillée de la façon dutiliser Trait pour résoudre un problème dhéritage unique en PHP🎜

Problèmes de compilation

🎜Si un Trait a les mêmes propriétés et méthodes que la classe qui référence le Trait, nous devons utiliser le mot-clé instansof pour indiquer que le La méthode est une classe lors d'un appel externe. C'est toujours un Trait. 🎜🎜Parce que l'interpréteur PHP copiera le Trait dans le corps de définition de la classe lors de la compilation, mais ne gérera pas les problèmes d'incompatibilité introduits par cette opération, nous devons donc résoudre les problèmes de compatibilité. 🎜🎜Pour plus de connaissances liées à la programmation, veuillez visiter : 🎜Enseignement de la programmation🎜 ! ! 🎜

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!

Déclaration:
Cet article est reproduit dans:. en cas de violation, veuillez contacter admin@php.cn Supprimer