自PHP5.4.0起,PHP实现了一种代码复用的方法,称为trait。 众所周知,PHP中是单继承的,trait是为类似PHP的单继承语言而准备得一种代码复用机制。trait为了减少单继承语言的限制,使开发人员能够自由地在不同层次结构内独立的类中复用method。trait和class组合的语义定义了一种减少复杂性的方式,避免传统多继承问题。 trait和class相似,但仅仅在用细粒度和一致的方式来组合功能。无法通过trait自身来实例化。它为传统继承增加了水平特性的组合;也就是说,应用的几个class之间不需要继承。
简单的例子 首先我们举个例子来介绍trait,和类定义相似,但使用关键字trait定义。在类中使用use组合。 <?php trait T{     public function t1(){         return 't1';     }         public function t2(){         return 't2';     } }     class Demo{     use T;     public function test(){         return 'test';     } }     $demo = new Demo; echo $demo->t1(),'</br>'; echo $demo->test(); 输出结果: PHP学习之PHP trait解析 随笔 第1张 多个trait冲突解决 ​如果使用多个trait,但是出现了方法名相同,这就出现了冲突,就要手动指定使用哪个trait的方法,使用insteadof关键字实现。
<?php trait T{     public function t1(){          return 't1';     }         public function t2(){          return 't2';     } }     trait T2{     public function t1(){          return 't3';     } }     class Demo{     use T,T2{         //使用T的m1方法          T::t1 insteadof T2;     }     public function test(){          return 'test';     } }     $demo = new Demo; echo $demo->t1(),'</br>'; echo $demo->test(); 输出结果: PHP学习之PHP trait解析 随笔 第2张 ​在冲突的时候,也可以使用use定义方法别名解决冲突,例子如下:
<?php trait T{     public function t1(){          return 't1';     }         public function t2(){          return 't2';     } }     trait T2{     public function t1(){          return 't3';     } }     class Demo{     use T,T2{          //使用T的m1方法          T::t1 insteadof T2;          T2::t1 as new_t1;     }     public function test(){          return 'test';     } }     $demo = new Demo; echo $demo->t1(),'</br>'; echo $demo->new_t1(),'</br>'; echo $demo->test(); 输出结果: PHP学习之PHP trait解析 随笔 第3张 改变访问权限 ​也可以使用use关键字来改变方法的访问权限。
<?php trait T{     public function t1(){          return 't1';     }         public function t2(){          return 't2';     } }     class Demo{     use T{          t2 as protected;     }     public function test(){          return 'test';     } }     $demo = new Demo; echo $demo->t1(),'</br>'; echo $demo->t2(),'</br>'; echo $demo->test(); 输出结果: PHP学习之PHP trait解析 随笔 第4张

 

上面只是介绍了一些常用的特性,详细可参考官方手册: https://php.net/manual/zh/language.oop5.traits.php 自PHP5.4.0起,PHP实现了一种代码复用的方法,称为trait。 众所周知,PHP中是单继承的,trait是为类似PHP的单继承语言而准备得一种代码复用机制。trait为了减少单继承语言的限制,使开发人员能够自由地在不同层次结构内独立的类中复用method。trait和class组合的语义定义了一种减少复杂性的方式,避免传统多继承问题。 trait和class相似,但仅仅在用细粒度和一致的方式来组合功能。无法通过trait自身来实例化。它为传统继承增加了水平特性的组合;也就是说,应用的几个class之间不需要继承。 简单的例子 首先我们举个例子来介绍trait,和类定义相似,但使用关键字trait定义。在类中使用use组合。 <?php trait T{     public function t1(){         return 't1';     }         public function t2(){         return 't2';     } }     class Demo{     use T;     public function test(){         return 'test';     } }     $demo = new Demo; echo $demo->t1(),'</br>'; echo $demo->test(); 输出结果: PHP学习之PHP trait解析 随笔 第5张PHP学习之PHP trait解析 随笔 第6张 多个trait冲突解决 ​如果使用多个trait,但是出现了方法名相同,这就出现了冲突,就要手动指定使用哪个trait的方法,使用insteadof关键字实现。
<?php trait T{     public function t1(){          return 't1';     }         public function t2(){          return 't2';     } }     trait T2{     public function t1(){          return 't3';     } }     class Demo{     use T,T2{         //使用T的m1方法          T::t1 insteadof T2;     }     public function test(){          return 'test';     } }     $demo = new Demo; echo $demo->t1(),'</br>'; echo $demo->test(); 输出结果: PHP学习之PHP trait解析 随笔 第7张PHP学习之PHP trait解析 随笔 第8张 ​在冲突的时候,也可以使用use定义方法别名解决冲突,例子如下:
<?php trait T{     public function t1(){          return 't1';     }         public function t2(){          return 't2';     } }     trait T2{     public function t1(){          return 't3';     } }     class Demo{     use T,T2{          //使用T的m1方法          T::t1 insteadof T2;          T2::t1 as new_t1;     }     public function test(){          return 'test';     } }     $demo = new Demo; echo $demo->t1(),'</br>'; echo $demo->new_t1(),'</br>'; echo $demo->test(); 输出结果: PHP学习之PHP trait解析 随笔 第9张PHP学习之PHP trait解析 随笔 第10张 改变访问权限 ​也可以使用use关键字来改变方法的访问权限。
<?php trait T{     public function t1(){          return 't1';     }         public function t2(){          return 't2';     } }     class Demo{     use T{          t2 as protected;     }     public function test(){          return 'test';     } }     $demo = new Demo; echo $demo->t1(),'</br>'; echo $demo->t2(),'</br>'; echo $demo->test(); 输出结果: PHP学习之PHP trait解析 随笔 第11张PHP学习之PHP trait解析 随笔 第12张 上面只是介绍了一些常用的特性,详细可参考官方手册: https://php.net/manual/zh/language.oop5.traits.php

 

SRE实战 互联网时代守护先锋,助力企业售后服务体系运筹帷幄!一键直达领取阿里云限量特价优惠。
扫码关注我们
微信号:SRE实战
拒绝背锅 运筹帷幄