原型(trait)
概念
- 概念
- trait 为了减少单继承语言的限制
- 可以在不同层次结构内独立的类中复用类的方法集
<?php
trait A{
public function getInfo() {
echo 'Javascript高级程序设计<br>';
}
}
class Student {
use A;
}
//测试
$stu=new Student;
$stu->getInfo();
?>
引入多个trait
<?php
trait A{
public function getInfo1() {
echo 'Javascript高级程序设计<br>';
}
}
trait B{
public function getInfo2() {
echo 'PHP和MySQL Web开发<br>';
}
}
class Student {
use A, B;
}
//测试
$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 'Javascript高级程序设计<br>';
}
}
trait B{
public function getInfo() {
echo 'PHP和MySQL Web开发<br>';
}
}
//使用原型
class Student {
use A,B{
A::getInfo insteadof B; //将A中的getInfo替换掉B中的getInfo
// B::getInfo insteadof A; //将B中的getInfo替换掉A中的getInfo
}
}
//测试
$stu=new Student;
$stu->getInfo();
?>
方法改名
<?php
trait A{
public function getInfo() {
echo 'Javascript高级程序设计<br>';
}
}
trait B{
public function getInfo() {
echo 'PHP和MySQL Web开发<br>';
}
}
//使用原型
class Student {
use A,B{
A::getInfo insteadof B; //将A中的getInfo替换掉B中的getInfo
B::getInfo as show; //将B的getInfo改名为show
}
}
//测试
$stu= new Student;
$stu->getInfo();
$stu->show();
?>
更改权限
<?php
trait A{
private function show() {
echo 'Javascript高级程序设计<br>';
}
}
class Student {
use A{
//show as public; //将show方法权限设为public;
show as public show2; //将show方法设置public,并改名为show2
}
}
//测试
$stu=new Student;
// $stu->show();
$stu->show2();
?>
其他
- 参见数据手册
- 多个trait可以组成一个trait
- trait可以定义抽象成员
- trait可以定义静态成员
- trait可以定义属性