请选择 进入手机版 | 继续访问电脑版
绿茶科技社区

PHP学习之PHP trait解析

2019-10-25 01:34
1283

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有帐号?立即注册

x
自PHP5.4.0起,PHP实现了一种代码复用的方法,称为trait。
众所周知,PHP中是单继承的,trait是为类似PHP的单继承语言而准备得一种代码复用机制。trait为了减少单继承语言的限制,使开发人员能够自由地在不同层次结构内独立的类中复用method。trait和class组合的语义定义了一种减少复杂性的方式,避免传统多继承问题。
trait和class相似,但仅仅在用细粒度和一致的方式来组合功能。无法通过trait自身来实例化。它为传统继承增加了水平特性的组合;也就是说,应用的几个class之间不需要继承。
[size=18.6667px]简单的例子
首先我们举个例子来介绍trait,和类定义相似,但使用关键字trait定义。在类中使用use组合。
  1. <?php
  2. trait T{
  3.     public function t1(){
  4.         return 't1';
  5.     }


  6.     public function t2(){
  7.         return 't2';
  8.     }
  9. }


  10. class Demo{
  11.     use T;
  12.     public function test(){
  13.         return 'test';
  14.     }
  15. }


  16. $demo = new Demo;
  17. echo $demo->t1(),'</br>';
  18. echo $demo->test();
复制代码
输出结果:


[size=18.6667px]多个trait冲突解决
​如果使用多个trait,但是出现了方法名相同,这就出现了冲突,就要手动指定使用哪个trait的方法,使用insteadof关键字实现。
  1. <?php
  2. trait T{
  3.     public function t1(){
  4.         return 't1';
  5.     }


  6.     public function t2(){
  7.         return 't2';
  8.     }
  9. }


  10. trait T2{
  11.     public function t1(){
  12.         return 't3';
  13.     }
  14. }


  15. class Demo{
  16.     use T,T2{
  17.         //使用T的m1方法
  18.         T::t1 insteadof T2;
  19.     }
  20.     public function test(){
  21.         return 'test';
  22.     }
  23. }


  24. $demo = new Demo;
  25. echo $demo->t1(),'</br>';
  26. echo $demo->test();
复制代码
输出结果:

在冲突的时候,也可以使用use定义方法别名解决冲突,例子如下:
  1. <?php
  2. trait T{
  3.     public function t1(){
  4.         return 't1';
  5.     }


  6.     public function t2(){
  7.         return 't2';
  8.     }
  9. }


  10. trait T2{
  11.     public function t1(){
  12.         return 't3';
  13.     }
  14. }


  15. class Demo{
  16.     use T,T2{
  17.         //使用T的m1方法
  18.         T::t1 insteadof T2;
  19.         T2::t1 as new_t1;
  20.     }
  21.     public function test(){
  22.         return 'test';
  23.     }
  24. }


  25. $demo = new Demo;
  26. echo $demo->t1(),'</br>';
  27. echo $demo->new_t1(),'</br>';
  28. echo $demo->test();
复制代码
输出结果:

[size=18.6667px]改变访问权限

​也可以使用use关键字来改变方法的访问权限。

  1. <?php
  2. trait T{
  3.     public function t1(){
  4.         return 't1';
  5.     }


  6.     public function t2(){
  7.         return 't2';
  8.     }
  9. }


  10. class Demo{
  11.     use T{
  12.         t2 as protected;
  13.     }
  14.     public function test(){
  15.         return 'test';
  16.     }
  17. }


  18. $demo = new Demo;
  19. echo $demo->t1(),'</br>';
  20. echo $demo->t2(),'</br>';
  21. echo $demo->test();
复制代码
输出结果:

[size=18.6667px]上面只是介绍了一些常用的特性,详细可参考官方手册:https://php.net/manual/zh/language.oop5.traits.php


分享到 :
0 人收藏

3 个回复

倒序浏览
程序人生  金牌会员 | 2019-10-25 01:50:19
边撸边过
JustRun  金牌会员 | 2019-11-18 08:41:25
顶顶更健康
北岛函  高级会员 | 2019-11-23 07:53:43
我是个凑数的。。。
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

举报|Archiver|手机版|小黑屋|Lvchakeji Inc.  

Powered by Discuz! X3.3 © 2001-2016 Comsenz Inc.

返回顶部