trait 为了减少单继承语言的限制,可以在不同层次结构内独立的类中复用类的方法集。
<?php
//原型
trait A{
public function getInfo() {
echo '锄禾日当午<br>';
}
}
//使用原型
class Student {
use A; //代码复用
}
//测试
$stu=new Student;
$stu->getInfo(); //锄禾日当午
引入多个 trait
<?php
//原型
trait A{
public function getInfo1() {
echo '锄禾日当午<br>';
}
}
trait B{
public function getInfo2() {
echo '床前明月光<br>';
}
}
//使用原型
class Student {
use A,B; //引入A、B trait
}
//测试
$stu=new Student;
$stu->getInfo1(); //锄禾日当午
$stu->getInfo2(); //床前明月光
trait和继承结合
<?php
trait A{
public function getInfo() {
echo '这是trait原型<br>';
}
}
class Person {
public function getInfo() {
echo '这是Person类<br>';
}
}
//继承类同时代码复用
class Student extends Person {
use A; //继承了getInfo,有被A中getInfo覆盖
}
//测试
$stu=new Student;
$stu->getInfo(); //这是trait原型
解决同名冲突
<?php
//原型
trait A{
public function getInfo() {
echo '锄禾日当午<br>';
}
}
trait B{
public function getInfo() {
echo '床前明月光<br>';
}
}
//使用原型
class Student {
use A,B{ //引入A和B的trait,同时解决名称冲突
//方法一:方法替换
//A::getInfo insteadof B; //将A中的getInfo替换掉B中的getInfo
//B::getInfo insteadof A; //将B中的getInfo替换到A中的getInfo
//方法二:改名
A::getInfo insteadof B;
B::getInfo as show; //将B的getInfo改名为show
}
}
//测试
$stu=new Student;
$stu->getInfo(); //锄禾日当午
$stu->show(); //床前明月光
/*
同名冲突的解决方法有两个:
第一:方法替换
第二:方法改名
更改权限
<?php
trait A{
private function show() {
echo '锄禾日当午<br>';
}
}
class Student {
use A{
//show as public; //将show方法权限设为public;
show as public show2; //将show方法设置public,并改名为show2
}
}
$stu=new Student;
//$stu->show();
$stu->show2();
**多学一招:**具体参见手册
1、 多个trait可以组成一个trait
2、 trait可以定义抽象成员
3、 trait可以定义静态成员
4、 trait可以定义属性