1.3 trait(原型)

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可以定义属性