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

【现代PHP专题(5)】类多重继承Traits的替代方法

时间:2023-03-29 20:42:44 PHP

概述Traits是PHP5.4的一个新特性,其目的是解决PHP类不能多重继承的问题。特性不是类!无法实例化。可以理解为一组方法,可以被不同的类调用。只需要在类中使用关键字use来导入,就可以引入多个Traits,用','分隔。简单使用traitmyTrait{public$traitPublic='public';受保护的$traitProtected='protected';函数traitMethod1(){echo__METHOD__,PHP_EOL;}functiontraitMethod2(){echo__METHOD__,PHP_EOL;}}classmyClass{使用myTrait;}$obj=newmyClass();$obj->traitMethod1();$obj->traitMethod2();//↓↓只能调用公共属性和方法;protected和private仅用于在特征内调用;echo$obj->traitPublic;优先级问题Trait会覆盖继承的方法,当前类会覆盖Trait方法。即继承方法test();//c::test()Traits方法<当前类方法$c->test1();//A::test1()Inheritedmethodtest();//B::test()$c->t();//B::test()可以重命名为as可以用来修改方法访问控制特征HelloWorld{publicfunctionsayHello(){echo'HelloWorld!';}}//修改sayHello类A的访问控制{useHelloWorld{sayHelloasprotected;}}//给方法一个改变访问控制的别名//原来sayHello的访问控制不会发生ChangeclassB{useHelloWorld{sayHelloasprivatemyPrivateHello;}}$a=newA();$a->sayHello();//致命错误:从上下文''调用受保护的方法A::sayHello();更改了sayHello;$b=newB();$b->sayHello();的访问规则//HelloWorld中使用了Traittrait!TraitHello{publicfunctionsayHello(){echo'Hello';}}traitWorld{publicfunctionsayWorld(){echo'Worldd!';}}traitHelloWorld{使用Hello,World;}classMyHelloWorld{使用HelloWorld;}$o=newMyHelloWorld();$o->sayHello();$o->sayWorld();//HelloWorld!Trait中的抽象成员为了对使用的类强加强制要求,trait支持使用抽象方法traitHello{publicfunctionsayHelloWorld(){echo'Hello'.$this->getWorld();}abstractpublicfunctiongetWorld();}classMyHelloWorld{private$world;使用你好;//必须在特征方法中实现抽象,否则致命错误:MyHelloWorld类包含1个抽象方法,因此必须声明为抽象方法或实现其余方法publicfunctiongetWorld(){return$this->world;}publicfunctionsetWorld($val){$this->world=$val;}}$obj=newMyHelloWorld();echo$obj->setWorld();Trait中的静态成员Traits可以通过静态成员静态方法定义,静态变量不能直接定义,但是静态变量可以通过trait方法引用。#staticproperty;traitCounter{publicfunctioninc(){static$c=0;$c=$c+1;回声“$c\n”;}}classC1{使用计数器;}classC2{使用计数器;}$o=newC1();$o->inc();//回显1$o->inc();//echo2;$p=newC2();$p->inc();//echo1#staticmethodtraitStaticExample{publicstaticfunctiondoSomething(){echo'做某事';}}classExample{使用StaticExample;}Example::doSomething();//属性特征PropertiesTrait{public$x=1;}classPropertiesExample{usePropertiesTrait;}$example=newPropertiesExampleinDoingsomethingTrait;echo$example->x;//1如果一个trait定义了一个属性,那个类不能定义同名的属性,否则如果属性在类中的定义与trait中的定义(还有可见性和初始值)兼容,就会产生错误错误级别为E_STRICT,否则为致命错误。traitPropertiesTrait{public$same=true;public$different=false;}classPropertiesExample{使用PropertiesTrait;公共$相同=真;//严格标准public$different=true;//致命错误}参考链接:http://www.php.net/manual/zh/...