欢迎来到天天文库
浏览记录
ID:47403009
大小:35.00 KB
页数:8页
时间:2019-07-04
《php trait 多重继承的实现案例》由会员上传分享,免费在线阅读,更多相关内容在教育资源-天天文库。
1、phptrait多重继承的实现案例自PHP5.4.0起,PHP实现了代码复用的一个方法,称为traits。Traits是一种为类似PHP的单继承语言而准备的代码复用机制。Trait为了减少单继承语言的限制,使开发人员能够自由地在不同层次结构内独立的类中复用方法集。Traits和类组合的语义是定义了一种方式来减少复杂性,避免传统多继承和混入类(Mixin)相关的典型问题。Trait和一个类相似,但仅仅旨在用细粒度和一致的方式来组合功能。Trait不能通过它自身来实例化。它为传统继承增加了水平特性的组合;也就是说,
2、应用类的成员不需要继承。在我理解说白了就是在继承类链中隔离了子类继承父类的某些特性(就是子类“要用父类的特性的时候”,如果trait有,就优先调用trait的方法、属性等)。var.PHP_EOL; } functiona() { e
3、cho"a".PHP_EOL; }} interfaceMyInterface{ function__construct(); functionb();} abstractclassMyAbstract{ protected$var2="MyAbstract_var"; useMyTrait; functionb() { echo"b".PHP_EOL; }} classMyClassextendsMyAbstractimplementsMyInterface{
4、 protected$var3="MyClass_var"; //也可以在这里引用,不区分继承关系 //useMyTrait; functionc() { echo"c".PHP_EOL; }} $class=newMyClass();$class->a();$class->b();$class->c();输出结果MyTrait_varabc优先级从基类继承的成员被trait插入的成员所覆盖,来自当前类的成员覆盖trait的方法。classBase{ publicfunc
5、tionsayHello(){ echo'Hello'; }}traitSayWorld{ publicfunctionsayHello(){ parent::sayHello(); echo'World!'; } publicfunctionsayHellos(){ echo'HelloWorld!'; }}classMyHelloWorldextendsBase{ useSayWorld; publicfunctionsayHell
6、os(){ echo'HelloUniverse!'; }}$o=newMyHelloWwww.shanxiwang.netorld();$o->sayHello(); #HelloWorld!$o->sayHellos(); #HelloUniverse!3、多个trait通过逗号分隔,在use声明列出多个trait,可以都插入到一个类中。traitHello{ publicfunctionsayHello(){ echo'Hello'; }}traitWorld{ p
7、ublicfunctionsayWorld(){ echo'World'; }}classMyHelloWorld{ useHello,World;}$o=newMyHelloWorld();$o->sayHello();#Hello$o->sayWorld();#World4、多Traits冲突的解决如果两个trait都插入了一个同名的方法,如果没有明确解决冲突将会产生一个致命错误。为了解决多个trait在同一个类中的命名冲突,需要使用insteadof操作符来明确指定使用冲突方法中的哪一
8、个。以上方式仅允许排除掉其它方法,as操作符可以将其中一个冲突的方法以另一个名称来引入。traitA{ publicfunctionsmallTalk(){ echo'a'; } publicfunctionbigTalk(){ echo'A'; }}traitB{ publicfunctionsmallTalk(){ echo'
此文档下载收益归作者所有