当前位置: 首页 > 后端技术 > PHP

PHP特性之Trait(一)

时间:2023-03-29 20:24:28 PHP

看laravel文档的时候看到有一个类声明了Trait。工作中没用过,就去看官方文档了。原来这个类早在php5.4.0就有了。太糟糕了,它从未在项目中使用过。Trait看起来像一个类和一个接口,但它不是。Trait可以看作是一个类的部分实现,可以混合到一个或多个现有的PHP类中。它有两个功能:指示类可以做什么;提供模块实现。Trait是一种代码复用技术,为PHP的单继承限制提供了灵活的代码复用机制。为什么使用TraitPHP语言采用典型的单继承模型,在这种模型中,我们先写一个通用的根类,实现基本功能,然后扩展根类,创建更具体的子类,直接从父类继承实现。这称为继承层次结构,许多编程语言都使用这种模式。这种典型的继承模型在大多数情况下运行良好,但是如果您希望两个不相关的PHP类表现相似怎么办?Trait就是为了解决这类问题而诞生的。Trait可以将模块化的实现注入到多个不相关的类中,从而提高代码重用。让我们看几个简单的例子,简单地使用traitMember{publicfunctioninfo(){echo'thisistrait';}}classShowMember{使用成员;}$Member=newShowMember();$Member->info();上面的代码会输出thisistrait,从中可以看出Trait的使用非常简单,就是使用use关键字。您可能已经注意到命名空间和Trait都使用了use关键字。区别在于导入位置。Namespace在类定义体之外导入,而Trait在类定义体内部导入。Priority当一个类继承的基类与使用的Trait有相同的函数名时,应该优先考虑哪个,下面我们就来看看。traitMember{publicfunctioninfo(){echo'thisistrait';}}classBaseMember{publicfunctioninfo(){echo'这是基础';}}classShowMemberextendsBaseMember{useMember;}$Member=newShowMember();$Member->info();上面的代码将输出thisistrait。可以看出,当被继承的基类与Trait具有相同的功能时,Trait的优先级高于基类。让我们修改Trait代码traitMember{publicfunctioninfo(){parent::info();echo'这是特质';}}classBaseMember{publicfunctioninfo(){echo'这是基础';}}classShowMemberextendsBaseMember{useMember;}$Member=newShowMember();$Member->info();上面的代码会输出thisisbasethisistrait。也可以看出Trait的优先级高于基类,基类的功能可以在Trait中继承。接下来,再次修改代码。traitMember{publicfunctioninfo(){echo'thisistrait';}}classBaseMember{publicfunctioninfo(){echo'这是基础';}}classShowMemberextendsBaseMember{使用成员;publicfunctioninfo(){echo'这是节目';}}$Member=newShowMember();$Member->info();上面的代码会输出thisisshow。可以看出,优先级顺序是当前类“Trait”基类的优先级。