首页 > 编程 > PHP > 正文

PHP使用traits实现代码复用

2019-11-08 01:56:59
字体:
来源:转载
供稿:网友

php5.4后新增traits实现代码复用机制,Trait和类相似,但不能被实例化,无需继承,只需要在类中使用关键词use引入即可,可引入多个Traits,用','隔开。(1)Trait简单使用

<?php trait A {    public $var1 = 'test1';    public function test1() {        echo 'trait A::test1()';    }} trait B {    public $var2 = 'test2';    public function test2() {        echo 'trait B::test2()';    }} class C {    use A,B;} $c = new C();echo $c->var1; //test1$c->test2(); //trait B::test2()(2)优先级问题Trait会覆盖继承的方法,当前类会覆盖Trait方法。
trait A {    public $var1 = 'test';    public function test() {        echo 'A::test()';    }    public function test1() {        echo 'A::test1()';    }} class B {    public function test() {        echo 'B::test()';    }    public function test1() {        echo 'B::test1()';    }}class C extends B{    use A;    public function test() {        echo 'c::test()';    }} $c = new C();$c->test(); //c::test()$c->test1(); //A::test1()(3)多个Trait冲突问题如果没有解决冲突,会产生致命错误;可用insteadof来明确使用冲突中哪一个方法;可用as操作符将其中一个冲突方法另起名;
trait A {    public function test() {        echo 'A::test()';    }} trait B {    public function test() {        echo 'B::test()';    }} class C {    use A,B {        B::test insteadof A;        B::test as t;    }} $c = new C();$c->test(); //B::test()$c->t(); //B::test()   可以用as另起名(4)as可用来修改方法访问控制
trait  HelloWorld  {    public function  sayHello () {        echo  'Hello World!' ;    }} // 修改 sayHello 的访问控制class  A  {    use  HelloWorld  {  sayHello  as PRotected; }} // 给方法一个改变了访问控制的别名// 原版 sayHello 的访问控制则没有发生变化class  B  {    use  HelloWorld  {  sayHello  as private  myPrivateHello ; }} $b = new A();$b->sayHello(); //Fatal error: Call to protected method A::sayHello() from context ''(5)Trait中使用Trait
trait A {    public function test1() {        echo 'test1';    }} trait B {    public function test2() {        echo 'test2';    }} trait C {    use A,B;} class D {    use C;} $d = new D();$d->test2();  //test2(6)Trait支持抽象方法、支持静态方法、不可以直接定义静态变量,但静态变量可被trait方法引用。
trait A {    public function test1() {        static $a = 0;        $a++;        echo $a;    }     abstract public function test2(); //可定义抽象方法} class B {    use A;    public function test2() {     }} $b = new B();$b->test1(); //1$b->test1(); //2(7)Trait可定义属性,但类中不能定义同样名称属性
trait A {   public $test1;} class B {    use A;    public $test2;}

 


发表评论 共有条评论
用户名: 密码:
验证码: 匿名发表