Trait不是类也不是接口具体怎么使用
Trait不是(抽象的和实质的)类也不是接口(interface),只是用来把公共代码打包提供给其他类使用。由于php是单继承,即一个类只能有一个父类,所以Trait的作用就非常明显了,他可以让多个类共享使用公共的方法,绕过单继承的限制。
Trait里可以定义属性和方法,支持静态成员但不能定义常量。
1、静态成员,使用static修饰符修饰的属性和方法,例如:
a、静态属性(静态变量):
static $name = '张三';b、静态方法:
public static function sayHello()
{
echo 'Hello everyone!';
}
完整的Trait代码示例:
trait MyTrait {
// ✅ 可以:静态属性(静态成员)
public static $staticVar = '我是静态属性';
// ✅ 可以:静态方法(静态成员)
public static function staticMethod() {
return '我是静态方法';
}
// ✅ 可以:普通方法
public function normalMethod() {
return '我是普通方法';
}
// ❌ 不可以:常量(原文说不能定义常量)
// const MY_CONST = 123;
}使用这个Trait的类应该这样写:
class Test {
use MyTrait;
}
// 静态成员直接用类调用,不需要 new 对象!
echo Test::$staticVar; // 输出:我是静态属性
echo Test::staticMethod(); // 输出:我是静态方法在类的内部使用Trait定义的静态属性,可以这样写:
trait MyTrait {
public static $staticVar = '我是静态变量';
}
class Test {
use MyTrait;
public function demo() {
// ✅ 正确:在类内部用 self::
echo self::$staticVar;
}
// 静态方法里也一样
public static function staticDemo() {
echo self::$staticVar;
}
}在类的外部使用静态属性,就是类名::属性名或者方法名,例如:
Test::$staticVar;在类的内部使用Trait定义的静态方法,使用self::方法,外部使用类名::方法,例如:
trait MyTrait {
public static function traitStaticMethod() {
return "静态方法";
}
}
class Test {
use MyTrait;
public function demo() {
// 类内部:self::
echo self::traitStaticMethod();
}
}
// 类外部:类名::
echo Test::traitStaticMethod();2、在类的内部使用非静态方法,则用$this->方法,内部使用非静态属性使用$this->属性名,在外部使用必须先new类,然后->,例如:
trait MyTrait {
public function traitNormalMethod() {
return "普通方法";
}
}
class Test {
use MyTrait;
public function demo() {
// 内部必须用 $this->
echo $this->traitNormalMethod();
}
}
// 外部必须 new 成对象,再用 ->
$obj = new Test();
echo $obj->traitNormalMethod();总结终极记忆方法:
静态方法(static)
内部:self::
外部:类名::
普通方法(非 static)
内部:$this->
外部:对象 ->Trait可以定义抽象方法,必须使用abstract修饰,在使用Trait的类里必须实现Trait里定义的抽象方法。
页:
[1]