说到php代码复用,我们第一时间可能会想到继承,但是这种单一的继承语言一旦派生出过多的子类,就会引发一系列的问题,比如,依赖父类,耦合过大,破坏了类的封装性。那么有没有更好的方法来实现代码复用呢?从PHP5.4.0开始,PHP实现了另一种代码重用方法,称为traits。Traits是PHP等单继承语言的一种代码重用机制。为了减少单一继承语言的局限性,Trait使开发者可以在不同的层次结构中自由地复用独立类中的方法集。特征和类组合语义定义了一种降低复杂性并避免与传统多重继承和混入相关的典型问题的方法。Traits的基本方法的使用非常简单,只需要在类中使用use关键字即可。traitA{publicfunctiontest(){echo'traitA::test()';}}classb{使用A;}$b=newb();$b->test();Trait优先级高于父类方法,但低于当前类方法。traitA{publicfunctiontest(){echo'traitA::test()';}publicfunctiontest1(){echo'traitA::test1()';}}classbase{publicfunctiontest(){echo'base::test()';}publicfunctiontest1(){echo'base::test1()';}}classbextendsbase{使用A;publicfunctiontest(){echo'b::test()';}}$b=newb();$b->test();//b::test()$b->test1();//traitA::test1()trait冲突问题在使用时多个Traits有相同的方法名,就会发生冲突。使用insteadof和as可以解决方法名冲突的问题insteadof可以使用两个相同的方法名来声明一个特定的方法。traitA{publicfunctiontest(){echo'traitA::test()';}}traitB{publicfunctiontest(){echo'traitB::test()';}}classc{useA,B{A::testinsteadofB;//useinsteadof指定使用哪个方法B::testastestB;//useas修饰另一个方法名,必须在using之后使用而不是解决冲突}}$c=newc();$c->test();//traitA::test()$c->testB();//traitB::test()方法访问控制使用as关键字我们可以访问trait方法修改traitA的权限{publicfunctiontest(){echo'traitA::test()';}privatefunctiontest1(){echo'traitA::test1()';}}classb{使用A{测试作为保护;test1aspublictest2;//更改权限时也可以修改名称}}$b=newb();$b->test();//致命错误:调用受保护方法b::test()$b->test2();//traitA::test1()Trait嵌套使用traitA{publicfunctiontest1(){echo'test1';}}traitB{publicfunctiontest2(){echo'test2';}}特质C{我们eA,B;}类D{使用C;}$d=新D();$d->test2();//test2变量、属性、方法定义Trait可以定义属性,但是类中不能定义同名属性traitA{public$test1;}B类{使用A;公共$测试;public$test1;//严格标准:B和A在B的组合中定义相同的属性($test1)...}Trait支持抽象方法,支持静态方法,不能直接定义静态变量,但是静态变量可以被trait方法引用traitA{publicfunctiontest1(){static$a=0;$a++;回声$a;}抽象公共函数test2();//可以定义抽象方法}classB{useA;公共函数test2(){}}$b=newB();$b->测试1();//1$b->test1();//2和javascript相比,traituse的使用大概类似于javascript中的调用,将另一个对象挂载到当前对象的执行环境中。当然javascript是一种基于原型的语言。两者都不具有可比性。只是使用方法差不多,有助于理解。函数a(){this.name="a";this.getName=function(){console.log(this.name);}}函数b(){this.name="b";a.call(this);}varb=newb();b.getName();//a因为javascript中的变量环境是基于函数的,所以会输出一个博客链接:php代码重用机制--traits,本文后续更新会贴在博客。
