在介绍Trait的基本使用之前,先介绍Trait使用多个Traittrait成员的更复杂的用法{publicfunctioninfo(){echo'thisistrait,';}}traitAdmin{publicfunctionshow(){echo'这是管理员,';}}classShowMember{useMember,Admin;}$Member=newShowMember();$Member->info();$Member->show();直接使用,用逗号分隔,上面的程序会输出thisistrait,thisisadmin,。命名冲突如果使用了多个Traits,在多个Traits中重复命名,此时会产生致命错误。为了正确使用这些Traits,我们需要使用insteadof来调用这些同名的方法。traitMember{publicfunctioninfo(){echo'这是会员信息,';}publicfunctionshow(){echo'这是会员秀,';}}traitAdmin{publicfunctioninfo(){echo'这是管理员信息,';}publicfunctionshow(){echo'这是管理员秀,';}}classShowMember{useMember,Admin{Member::infoinsteadofAdmin;//用Member的info方法代替Admin的info方法Admin::showinsteadMember;//用Admin的show方法代替Member的show方法}}$Member=newShowMember();$Member->info();$Member->show();以上程序会输出thisismemberinfo,thisisadminshow,.这时候使用insteadof来声明,我需要使用Trait中的哪个方法。避免冲突引起的错误。Trait的抽象成员Trait和普通类一样,也是一个成员变量,也可以定义抽象方法来强制要求。traitMember{publicfunctioninfo(){echo'这是会员信息,';}abstractpublicfunctionshow();}classShowMember{使用成员;publicfunctionshow(){//TODO:实施show()方法。}}$Member=newShowMember();$Member->info();Trait的静态成员Trait也是一个trait成员,可以是静态成员变量{publicfunctioninfo(){echo'thisismemberinfo,';}公共静态$_a=1;publicfunctionshow(){echoself::$_a;}}classShowMember{useMember;}$Member=newShowMember();$Member->show();//会输出1echo$Member::$_a;//也会输出1Trait的访问修饰符。在上面的很多例子中,你可以看到Trait的方法和属性都被添加了public访问修饰符。这是否意味着Trait也可以使用访问修饰符?嗯,答案是肯定的。但是Trait中的属性和方法如果需要被外部类使用,就必须是public的,即使是protected也不能被外部类使用。那如果我需要在外部类中私有化这个方法呢,我们看一个列traitMember{publicstaticfunctionshow(){echo'show';}}classShowMember{使用Member{显示为私有;//私有化Trait中的show方法}publicfunctionOutShow(){Member::show();}}$Member=newShowMember();$Member->OutShow();//$Member::show();//此时直接调用show方法会报致命错误
