Trait 是一种类似PHP单继承语言而准备的代码复用机制
目前可在很多框架汇总看到,比如Yii 、Laravel
为什么要用到这个?
php是单继承的语言,而Trait就是为了解决php不能多继承提高代码的复用并且摒弃一下多线程的诟病而产生的。
1.确定版本:
使用的是在线调试工具
限制:php5.4开始可以使用
http://www.shucunwang.com/RunCode/php5.4/
我们选择5.4的版本
ps:当然选择低版本会报错误
syntax error, unexpected T_STRING
2.先简单实现Trait
a)创建
ps:Trait不能被实例化
b)调用
打印结果:
3.优先级(如果类中方法与trait中重名,那么用的是谁的?)
总结:
a)Trait会覆盖当前类继承的方法
b)当前类的方法会覆盖Trait的方法
即:调用类>Trait>父类
4.多个Trait冲突问题(ps:当多个Trait中方法名相同时怎么处理?)
由此看出
a)这里声明Test中的testA方法替换Test1中的TestA方法
b)Test1中的testA方法起别名为bb
总结:
当出现冲突时可以使用insteadof来确定使用哪一个方法
使用as就可以使用另一个方法
相关测试
a)直接其别名是别名不使用insteadof声明是否可以? (否,会报错)
b)别名可以单独使用? (可以)
c)当出现三个或三个以上时怎样处理?
运行结果:
ps:少一个依旧会报错
5.Trait嵌套(Trait中包含Trait)
运行结果:
总结:
依旧使用use可以实现相互嵌套
相关测试
a)如果冲突是否和类中解决一样? 是的,不处理会报错
b)Trait中的方法与嵌套中的方法吗一样,那么是冲突还是按优先级分?
运行结果:
可见是按当前的算。
6.Trait支持抽象方法、支持静态方法,不可以直接定义静态变量,但静态变量可以被Trait方法引用
运行结果:
ps:当定义抽象方法时,必须在使用它的class中实现,否则会产生致命错误.
当然Trait中也可以定义属性。不过如果类中定义了和他不同的属性也会报致命错误。
从上面可以看出,Trait既不是接口也不是类。主要是为了解决单继承语言的限制。是PHP多重继承的一直解决方案。
比如同时要继承两个Abstract Class将会很麻烦,而Trait就是为了解决类似问题。它能被加入到一个或多个已存在的类中。它声明了类能做什么(表面了其接口的特性),同时也包含具体的实现(表面了其类的特性)
总的来说,个人感觉就是Trait = abstract class - interface