时间:2021-07-01 10:21:17 帮助过:23人阅读
trait
。众所周知,PHP中是单继承的,trait是为类似PHP的单继承语言而准备得一种代码复用机制。trait为了减少单继承语言的限制,使开发人员能够自由地在不同层次结构内独立的类中复用method。trait和class组合的语义定义了一种减少复杂性的方式,避免传统多继承问题。
trait
和class
相似,但仅仅在用细粒度和一致的方式来组合功能。无法通过trait自身来实例化。它为传统继承增加了水平特性的组合;也就是说,应用的几个class之间不需要继承。
推荐PHP视频教程:https://www.gxlcms.com/course/list/29/type/2.html
1、简单的例子
首先我们举个例子来介绍trait,和类定义相似,但使用关键字trait定义。在类中使用use组合。
<?php trait T{ public function t1(){ return 't1'; } public function t2(){ return 't2'; } } class Demo{ use T; public function test(){ return 'test'; }多个 } $demo = new Demo; echo $demo->t1(),'</br>'; echo $demo->test();
输出结果:
t1
test
2、多个trait冲突解决
如果使用多个trait,但是出现了方法名相同,这就出现了冲突,就要手动指定使用哪个trait的方法,使用insteadof
关键字实现。
<?php trait T{ public function t1(){ return 't1'; } public function t2(){ return 't2'; } } trait T2{ public function t1(){ return 't3'; } } class Demo{ use T,T2{ //使用T的m1方法 T::t1 insteadof T2; } public function test(){ return 'test'; } } $demo = new Demo; echo $demo->t1(),'</br>'; echo $demo->test();
输出结果:
t1
test
在冲突的时候,也可以使用use定义方法别名解决冲突,例子如下:
<?php trait T{ public function t1(){ return 't1'; } public function t2(){ return 't2'; } } trait T2{ public function t1(){ return 't3'; } } class Demo{ use T,T2{ //使用T的m1方法 T::t1 insteadof T2; T2::t1 as new_t1; } public function test(){ return 'test'; } } $demo = new Demo; echo $demo->t1(),'</br>'; echo $demo->new_t1(),'</br>'; echo $demo->test();
输出结果:
t1
t3
test
3、改变访问权限
也可以使用use
关键字来改变方法的访问权限。
<?php trait T{ public function t1(){ return 't1'; } public function t2(){ return 't2'; } } class Demo{ use T{ t2 as protected; } public function test(){ return 'test'; } } $demo = new Demo; echo $demo->t1(),'</br>'; echo $demo->t2(),'</br>'; echo $demo->test();
输出结果:
上面知识介绍了一些常用的特性,详细可参考官方手册:
https://www.php.com/manual/zh/language.oop5.traits.php
更多PHP相关问题可以访问PHP中文网:https://www.gxlcms.com/
谢谢!
以上就是深入解析PHP trait的详细内容,更多请关注Gxl网其它相关文章!