原生PHP
PHP中trait使用方法,PHP导入多个类的方法,PHP8.2中trait的新特性
05-23 17:13trait是一种代码复用机制,它可以在一个类中使用另一个trait的代码。
比如,当一个类需要用到另一个类或多个类时,常用的方法有继承、require引入文件并实例化类等。但PHP只支持单继承,require引入并实例化类后,也只能访问其中的public方法。
由此PHP提供了一种方式,通过trait类,完全将其它类导入到当前类中,导入后可视为当前类的一部分,区别是不同类中,可能存在相同名称的方法,此时可通过设置别名、设置优先级的方法来控制访问。
Trait类与当前使用类、继承的父类之间的调用优先级顺序如下:
当前使用类>Trait类>继承的父类。当存在同名方法时,会根据优先级覆盖掉同名的类。
trait使用示例:
insteadod关键字:
当引用的多个类中,包含相同的方法名时,可通过 insteadof 关键字设置优先级
as关键字:
当引用的多个类中,包含相同的方法名时,可通过 as 关键字设置别名,然后在类中重写重名的方法,实现每个方法都能正常使用
在定义trait类时,即使没有继承任何类,也可以在trait类的方法中通过“parent::父方法名”,提前申明要使用的父类方法
在use引用这个trait类时,必须有继承,且继承的父类要包含已经在trait类中声明过的,要使用的父类方法(parent::父方法名)
由此可看出,use引用trait类后,可视作当前类的一部分
在使用trait时,需要注意以下几点:
1. 抽象方法:Trait支持定义抽象方法,这意味着使用该trait的类必须实现这些抽象方法。在PHP 8.0.0之前,trait中的抽象方法只能是public或protected,不能是private;
2. 单继承语言:Trait是为类似PHP这样的单继承语言设计的,它可以帮助减少单继承语言的一些限制,使得代码更加灵活和可重用;
3. 不支持构造函数:Trait不能定义构造函数,因此它不能被实例化。Trait的主要目的是被类所使用,而不是作为一个独立的实体存在;
4. use关键字:要在一个类中使用trait,需要使用use关键字。这意味着trait的代码会被包含到类中,类可以访问trait中定义的方法和属性;
5. 冲突解决:如果多个trait中有相同的方法或属性,需要在类中明确指定如何解决冲突,否则会导致编译错误;
6. 访问控制:Trait中的方法可以是public、protected或private。但是,当trait中的方法被包含到类中时,它们的访问级别可能会受到类本身访问控制的影响;
7. trait优先级:当一个类使用了多个trait,且这些trait中有相同的方法时,可以通过insteadof关键字来指定优先使用哪个trait中的方法;