这个系列的文章是用来学习PHP的一些语法特性,用来加强自己对PHP的理解。在大多数情况下都是作为自己的学习笔记,文章内容不会超出PHP手册,所以想了解相关特性的可以直接去看PHP手册。
PHP 5.4加入了trait。
个人理解为trait在PHP中变相实现了多继承。但是我还不是很理解它的使用场景。
<?php
trait TraitClass {
function say () {
echo "trait say<br/>";
}
function walk () {
echo "trait walk<br/>";
}
}
class Father {
function say () {
echo "father say<br/>";
}
}
class Son extends Father {
use traitClass;
function walk () {
echo "son walk<br/>";
}
}
/**
* trait、基类和当前类同名方法优先级
* 当前类>trait>基类
*/
$son = new Son();
//todo trait方法与基类方法同名的情况下,trait的方法优先于基类的方法
$son->say();//输出结果:trait say
//todo 当前类的方法同名时,当前类方法优先于trait的方法
$son->walk();//输出结果:son walk
trait Trait1 {
function say () {
echo "Trait1 say<br/>";
}
function walk () {
echo "Trait2 walk<br/>";
}
function run () {
echo "Trait1 run<br/>";
}
}
trait Trait2 {
function say () {
echo "Trait2 say<br/>";
}
function walk () {
echo "Trait2 walk<br/>";
}
}
trait Trait3 {
function say () {
echo "Trait3 say<br/>";
}
function walk () {
echo "Trait3 walk<br/>";
}
}
class Son1 {
use Trait1, Trait2, Trait3 {
Trait1::say insteadof Trait2, Trait3;
Trait2::walk insteadof Trait1, Trait3;
Trait1::run as trait1Run;
}
}
/**
* 当有多个trait方法重名的时候,可以使用instendof方法排除不用的选项。个人觉得这个地方比较奇怪,不是指定而是排除,需要将那些不使用的trait一一列举出来
* 使用别名的方式不能解决冲突问题,因为使用别名之后,两种调用方式都会保留
*/
$son1 = new Son1();
//todo 当有多个trait方法重名的时候,需要将那些不使用的trait一一排除
$son1->say();//输出结果:Trait1 say
$son1->walk();//输出结果:Trait2 walk
//todo 使用别名的方式不能解决冲突问题,因为使用别名之后,两种调用方式都会保留
$son1->run();//输出结果:Trait1 run
$son1->trait1Run();//输出结果:Trait1 run