自 PHP 5.4.0 起,PHP 实现了一种代码复用的方法,称为 trait。
Trait为了减少单继承代码的限制,为了可以复用代码。
在laravel框架使用中,会发现trait使用较多
<?php
trait color{
public function red(){
return "red";
}
function yellow(){
}
static function blue(){
return "blue";
}
}
class useColor{
//使用该类
use color;
}
echo useColor::blue();
?>
优先级:
从基类继承的成员会被 trait 插入的成员所覆盖。优先顺序是来自当前类的成员覆盖了 trait 的方法,而 trait 则覆盖了被继承的方法。
多个trait:
trait color{
public function red(){
return "red";
}
function yellow(){
}
static function blue(){
return "blue";
}
}
trait font{
public function font_24(){
return "该字体号是24px";
}
}
class useColor{
//使用该类
use color,font;
}
$color = new useColor();
echo $color->font();
如果遇到了方法名冲突,如何解决:
<?php
trait A {
public function smallTalk() {
echo 'a';
}
public function bigTalk() {
echo 'A';
}
}
trait B {
public function smallTalk() {
echo 'b';
}
public function bigTalk() {
echo 'B';
}
}
class Talker {
use A, B {
B::smallTalk insteadof A;
A::bigTalk insteadof B;
}
}
?>
修改方法的访问控制:
使用 as 语法还可以用来调整方法的访问控制。
<?php
trait HelloWorld {
public function sayHello() {
echo 'Hello World!';
}
}
// 修改 sayHello 的访问控制
class Myprotected {
use HelloWorld { sayHello as protected; }
}
// 给方法一个改变了访问控制的别名
// 原版 sayHello 的访问控制则没有发生变化
class Myprivate {
use HelloWorld { sayHello as private myPrivateHello; }
}
?>