Trait

Trait 是一种类似PHP单继承语言而准备的代码复用机制

目前可在很多框架汇总看到,比如Yii 、Laravel

为什么要用到这个?
php是单继承的语言,而Trait就是为了解决php不能多继承提高代码的复用并且摒弃一下多线程的诟病而产生的。

1.确定版本:

使用的是在线调试工具
限制:php5.4开始可以使用

http://www.shucunwang.com/RunCode/php5.4/
图片1
我们选择5.4的版本

ps:当然选择低版本会报错误
syntax error, unexpected T_STRING

2.先简单实现Trait

a)创建
图片2
ps:Trait不能被实例化
b)调用
图片3打印结果:图片4

当要调用多个的时候
图片5打印结果:图片6

3.优先级(如果类中方法与trait中重名,那么用的是谁的?)

图片7运行结果:图片8

总结:
a)Trait会覆盖当前类继承的方法
b)当前类的方法会覆盖Trait的方法
即:调用类>Trait>父类

4.多个Trait冲突问题(ps:当多个Trait中方法名相同时怎么处理?)

如果直接使用,会产生致命错误
因此需要这样解决
图片9运行结果:图片10

由此看出
a)这里声明Test中的testA方法替换Test1中的TestA方法
b)Test1中的testA方法起别名为bb
总结:
当出现冲突时可以使用insteadof来确定使用哪一个方法
使用as就可以使用另一个方法

相关测试

a)直接其别名是别名不使用insteadof声明是否可以? (否,会报错)
b)别名可以单独使用? (可以)
c)当出现三个或三个以上时怎样处理?
图片11运行结果:图片12
ps:少一个依旧会报错

5.Trait嵌套(Trait中包含Trait)
图片13运行结果:图片14
总结:
依旧使用use可以实现相互嵌套

相关测试
a)如果冲突是否和类中解决一样? 是的,不处理会报错
b)Trait中的方法与嵌套中的方法吗一样,那么是冲突还是按优先级分?
图片15运行结果:图片16
可见是按当前的算。

6.Trait支持抽象方法、支持静态方法,不可以直接定义静态变量,但静态变量可以被Trait方法引用
图片17运行结果:图片18

ps:当定义抽象方法时,必须在使用它的class中实现,否则会产生致命错误.
当然Trait中也可以定义属性。不过如果类中定义了和他不同的属性也会报致命错误。

从上面可以看出,Trait既不是接口也不是类。主要是为了解决单继承语言的限制。是PHP多重继承的一直解决方案。
比如同时要继承两个Abstract Class将会很麻烦,而Trait就是为了解决类似问题。它能被加入到一个或多个已存在的类中。它声明了类能做什么(表面了其接口的特性),同时也包含具体的实现(表面了其类的特性)

总的来说,个人感觉就是Trait = abstract class - interface

发表评论