当前位置: 首页 > 后端技术 > PHP

肖峰、郭靖教你学习PHP的Trait

时间:2023-03-30 04:31:38 PHP

在PHP5.4之前,PHP面向对象需要重用代码的方式是使用类继承。但是PHP只支持单继承,单继承在处理比较复杂的业务逻辑时显得捉襟见肘。traits的使用场景如下:classPerson{publicfunctioneat(){echo"我是人,我可以吃
";}}classGuoJingextendsPerson{publicfunctionkungfu(){echo"伏龙十八掌!
";}}classXiaoFengextendsPerson{publicfunctionkungfu(){echo"降龙十八掌!
";}}郭靖类和小风类都是继承自Person,并且都有共同的功夫方法。很显然,我们不能把这个功夫方法写到Person类中,否则任何继承Person类的路人都会有功夫技能。这个问题可以用Trait来解决:";}}classPerson{publicfunctioneat(){echo"我是人,我可以吃
";}}classGuoJingextendsPerson{useTool;}classXiaoFengextendsPerson{useTool;}$guojing=newGuoJing();$xiaofeng=newXiaoFeng();$guojing->kungfu();$xiaofeng->kungfu();结果如下:降龙十八掌!伏龙十八掌!方法/属性重写如果Trait类、基类和本类中的方法或属性重名,以哪一个为准?";}}classPerson{publicfunctioneat(){echo"我是人,我可以吃
";}publicfunctionkungfu(){echo"不是每个人都知道功夫
";}}classGuoJingextendsPerson{使用工具;publicfunctionkungfu(){echo"除了降龙十八掌,我还知道九种引真经!
";}}classXiaoFengextendsPerson{useTool;}$guojing=newGuoJing();$guojing->kungfu();结果:除了降龙十八掌外,我还通晓九阴经!注释本班功法,结果为:伏龙十八掌!当方法或属性重名时,覆盖当前类中的方法trait的方法,并且trait的方法覆盖了基类中的方法组合多个trait当多个trait有同名的方法/属性时,会报错:";}}traitSkill{publicfunctionkungfu(){echo"强大的内功
";}}classGuoJing{useTool,Skill;}$guojing=newGuoJing();$guojing->kungfu();Fatalerror:Traitmethodkungfuhasnotbeenapplied,becausethereiscollisionswithothertraitmethodsonGuoJing解决办法:使用insteadof和as解决冲突insteadof:使用一个方法代替另一个as:Aliasthemethod";}}traitSkill{publicfunctionkungfu(){echo"强大的内功
";}}classXiaoFeng{useTool,Skill{Skill::kungfu代替Tool;技能::功夫作为能力;}}$xiaofeng=newXiaofeng();$xiaofeng->ability();trait方法的访问控制可以通过as关键字修改";}}classXiaoFeng{使用工具{工具::功夫作为受保护的能力;//修改方法的访问控制,并给方法取别名}}$xiaofeng=newXiaoFeng();$xiaofeng->ability();Error:Fatalerror:UncaughtError:CalltoprotectedmethodXiaoFeng::ability()fromcontextTrait组合Traits也可以组合Traits。同时Traits支持抽象方法、静态属性、静态方法";}}traitFeature{使用工具;抽象公共函数梦想();publicstaticfunctioncharacter(){echo"雷洛浩雄
";}}classXiaoFeng{使用特征;publicfunctiondream(){echo"长清:我是谁?
";}}$xiaofeng=newXiaoFeng();$xiaofeng->kungfu();XiaoFeng::character();$xiaofeng->dream();结果:降龙十八掌!正气英姿弄明白:我是谁?源码下载源码仓库链接