自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();
输出结果:
多个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();
输出结果:
​在冲突的时候,也可以使用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();
输出结果:
改变访问权限
​也可以使用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();
输出结果:
上面只是介绍了一些常用的特性,详细可参考官方手册: https://php.net/manual/zh/language.oop5.traits.php

最新文章

  1. 【调侃】IOC前世今生
  2. spring quartz分布式任务计划
  3. CSS入门
  4. JVM-字节码指令
  5. CSS3 中的 rem 值与 px 之间的换算
  6. A.2 Main
  7. ReentrantLock的原理学习
  8. hdu 4635 强连通度缩点
  9. A Tour of Go Switch evaluation order
  10. 基于AE的SimpleGIS框架的搭建
  11. 关于自动编译iOS工程,生成app及ipa文件的方法-备
  12. CF 13E Holes 【块状链表】
  13. Yii 多表关联relations,需要与with()方法联合使用
  14. vc6.0 使用Ado 连接MS-SqlServer2000 连接字符串
  15. ES6箭头函数和它的作用域
  16. 希尔排序----java实现
  17. Python网络编程学习_Day9
  18. python 组合样例
  19. JS实现图片&#39;&#39;推拉门&#39;&#39;效果
  20. XVIII Open Cup named after E.V. Pankratiev. Grand Prix of SPb

热门文章

  1. cdh版hbase构建Phoenix 遇到的坑
  2. 7月清北学堂培训 Day 4
  3. 注解之 @RestController 和 @RequestMapping
  4. League of Leesins
  5. Atcoder ABC 139E
  6. Jenkins系统初始化配置
  7. flask 自定义转换器
  8. 创建createElement
  9. centos7 - nginx配置安装phpmyadmin
  10. MySQL ALTER命令-修改数据表名或者修改数据表字段