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.
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 Trait
Trait
Trait是PHP 5.4引入的新概念,看上去既像类又像接口。【推荐学习:《PHP视频教程》】
其实都不是,Trait可以看做类的部分实现,可以混入一个或多个现有的PHP类中。
Trait是一种代码复用技术,为PHP的单继承限制提供了一套灵活的代码复用机制。
Trait作用
表明类可以做什么;
提供模块化实现。
开篇我就提到了PHP是单继承语言
,我们通常的习惯是:
先编写一个通用的基类,实现基本的功能,进行通用逻辑的封装,然后扩展这个基类;
然后再创建更具体的子类,直接从父类继承实现。
这叫方式就是单继承层次结构,很多编程语言都使用这个模式。
大多数时候这种典型的继承模型能够良好运作,但是如果想让两个无关的PHP类具有类似的行为,应该怎么做呢?
我查询了Laravel的源码,以自带的LoginController
为例,其中的登录认证就是通过Trait实现:
创建Trait很简单,跟创建类有点类似,只不过使用的关键字是trait
而不是class
,以上述的AuthenticatesUsers
为例:
我们通过trait
声明定义的是一个Trait,然后我们可以在这个Trait中像类一样定义要使用的属性和方法。
此外Trait支持嵌套和组合,即通过一个或多个Trait(多个用,分隔)组合成一个Trait,比如AuthenticatesUsers
就是如此:
注意:Trait中还支持定义抽象方法和静态方法,其中抽象方法必须在使用它的类中实现。
调用方法的优先级:
调用类>Trait>父类(如果有的话),方法可以覆盖,但属性不行。
注意:如果Trait中定义了一个属性,如果调用类中也定义这个属性则会报错。
Trait的使用方法也很简单,上面的截图示例中已经显示的很清楚明了:使用use
关键字。
注意:命名空间和Trait使用的都是use
关键字引入,不同之处在于导入位置,命名空间在类的定义体外导入,而Trait在类的定义体内导入。
如果Trait和引用Trait的类有相同的属性和方法,我们再外部调用时需要使用instansof
"]
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🎜PHP est un langage d'héritage unique
. Notre habitude habituelle est : 🎜LoginController
intégré. L'authentification de connexion est implémentée via Trait : 🎜🎜🎜trait
au lieu de class
ci-dessus. à titre d'exemple. :🎜🎜🎜🎜 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
: 🎜🎜🎜🎜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. 🎜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. 🎜🎜🎜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!