1.代码复用
<?php
//trait功能:代码复用
trait tindex
{
public function fun(){
printf("<pre>%s</pre>",print_r(get_class_vars(__CLASS__), true));
}
// get_class_vars:返回由类的属性组成的数组
}
class Test1
{
protected $name ='鹰眼';
protected $occ = '七武海';
use tindex;
}
class Test2
{
protected $name ='红发';
protected $occ = '海贼';
use tindex;
}
echo (new Test1)->fun();
echo "<hr>";
echo (new Test2)->fun();
2.在继承上下文中的应用
<?php
//trait功能:在继承上下文中的应用
trait tdemo
{
public static function fun(){
return "这是trait中的fun方法";
}
}
//父类/基类
abstract class Dood
{
public static function fun(){
return "这是基类中的fun方法";
}
}
//子类
class sonDood extends Dood
{
//引用trait
use tdemo;
public static function fun(){
return "这是子类中的fun方法";
}
}
// 子类,父类,trait中存在同名方法的时候, 而trait在子类中调用时,子类 > trait > 父类
echo sonDood::fun();
3.实现功能扩展
<?php
// trait功能: 实现功能扩展
trait good
{
public function getfun(){
printf("<pre>%s</pre>",print_r(get_class_methods(__CLASS__), true));
// get_class_methods:返回由类的方法名组成的数组
}
}
trait user
{
protected $we = "下午好";
public function get(){
return $this->we;
}
}
trait demo
{
use good;
use user;
}
class cindex
{
use demo;
}
echo (new cindex)->get();
echo "<hr>";
echo (new cindex)->getfun();
4.解决命名冲突的问题
<?php
// trait功能:解决命名冲突的问题
trait good
{
public function fun(){
return "这是good中的fun()";
}
}
trait good1
{
public function fun(){
return "这是good1中的fun()";
}
}
trait demo
{
use good,good1{
//取别名
good::fun as refun;
//调用good1中的fun 替代good中fun
good1::fun insteadOf good;
}
}
class index
{
use demo;
}
echo (new index)->refun();
echo "<hr>";
echo (new index)->fun();
5.trait 和 interface接口的组合
<?php
// trait功能: trait 和 interface接口的组合
//接口
if(!interface_exists('inter')):
interface inter
{
//抽象方法
public function test();
}
endif;
//trait
if(!trait_exists('tra')){
trait tra
{
protected $name ='trait';
//实现
public function test(){
return "这是把原本在实现类中实现的抽象方法,改到{$this->name}中实现";
}
}
}
// 实现类
class demo implements inter
{
use tra;
}
//客户端
echo (new demo)->test();