PHP基础补全系列:Trait

来源:互联网 发布:保密三合一软件 编辑:程序博客网 时间:2024/06/05 11:01

这个系列的文章是用来学习PHP的一些语法特性,用来加强自己对PHP的理解。在大多数情况下都是作为自己的学习笔记,文章内容不会超出PHP手册,所以想了解相关特性的可以直接去看PHP手册。

PHP手册链接

PHP 5.4加入了trait。

个人理解为trait在PHP中变相实现了多继承。但是我还不是很理解它的使用场景。

<?phptrait 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 walktrait 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


0 0