转自: https://www.jianshu.com/p/fc053b2d7fd1

php从以前到现在一直都是单继承的语言,无法同时从两个基类中继承属性和方法,为了解决这个问题,php出了Trait这个特性(听说这个Trait和Go语言有点类似,具体没学过Go语言)

用法:通过在类中使用use 关键字,声明要组合的Trait名称,具体的Trait的声明使用Trait关键词,Trait不能实例化

如下代码实例:

  1. <?php
  2. trait Dog{
  3. public $name="dog";
  4. public function bark(){
  5. echo "This is dog";
  6. }
  7. }
  8. class Animal{
  9. public function eat(){
  10. echo "This is animal eat";
  11. }
  12. }
  13. class Cat extends Animal{
  14. use Dog;
  15. public function drive(){
  16. echo "This is cat drive";
  17. }
  18. }
  19. $cat = new Cat();
  20. $cat->drive();
  21. echo "<br/>";
  22. $cat->eat();
  23. echo "<br/>";
  24. $cat->bark();
  25. ?>

将会如下输出

Paste_Image.png

再测试Trait、基类和本类对同名属性或方法的处理,如下代码

  1. <?php
  2. trait Dog{
  3. public $name="dog";
  4. public function drive(){
  5. echo "This is dog drive";
  6. }
  7. public function eat(){
  8. echo "This is dog eat";
  9. }
  10. }
  11. class Animal{
  12. public function drive(){
  13. echo "This is animal drive";
  14. }
  15. public function eat(){
  16. echo "This is animal eat";
  17. }
  18. }
  19. class Cat extends Animal{
  20. use Dog;
  21. public function drive(){
  22. echo "This is cat drive";
  23. }
  24. }
  25. $cat = new Cat();
  26. $cat->drive();
  27. echo "<br/>";
  28. $cat->eat();
  29. ?>

如下显示

Paste_Image.png

所以:Trait中的方法或属性会覆盖 基类中的同名的方法或属性,而本类会覆盖Trait中同名的属性或方法

一个类可以组合多个Trait,通过逗号相隔,如下

use trait1,trait2

当不同的trait中,却有着同名的方法或属性,会产生冲突,可以使用insteadof或 as进行解决,insteadof 是进行替代,而as是给它取别名
如下实例:

  1. <?php
  2. trait trait1{
  3. public function eat(){
  4. echo "This is trait1 eat";
  5. }
  6. public function drive(){
  7. echo "This is trait1 drive";
  8. }
  9. }
  10. trait trait2{
  11. public function eat(){
  12. echo "This is trait2 eat";
  13. }
  14. public function drive(){
  15. echo "This is trait2 drive";
  16. }
  17. }
  18. class cat{
  19. use trait1,trait2{
  20. trait1::eat insteadof trait2;
  21. trait1::drive insteadof trait2;
  22. }
  23. }
  24. class dog{
  25. use trait1,trait2{
  26. trait1::eat insteadof trait2;
  27. trait1::drive insteadof trait2;
  28. trait2::eat as eaten;
  29. trait2::drive as driven;
  30. }
  31. }
  32. $cat = new cat();
  33. $cat->eat();
  34. echo "<br/>";
  35. $cat->drive();
  36. echo "<br/>";
  37. echo "<br/>";
  38. echo "<br/>";
  39. $dog = new dog();
  40. $dog->eat();
  41. echo "<br/>";
  42. $dog->drive();
  43. echo "<br/>";
  44. $dog->eaten();
  45. echo "<br/>";
  46. $dog->driven();
  47. ?>

输出如下

Paste_Image.png

as 还可以修改方法的访问控制

  1. <?php
  2. trait Animal{
  3. public function eat(){
  4. echo "This is Animal eat";
  5. }
  6. }
  7. class Dog{
  8. use Animal{
  9. eat as protected;
  10. }
  11. }
  12. class Cat{
  13. use Animal{
  14. Animal::eat as private eaten;
  15. }
  16. }
  17. $dog = new Dog();
  18. $dog->eat();//报错,因为已经把eat改成了保护
  19. $cat = new Cat();
  20. $cat->eat();//正常运行,不会修改原先的访问控制
  21. $cat->eaten();//报错,已经改成了私有的访问控制
  22. ?>

Trait也可以互相组合,还可以使用抽象方法,静态属性,静态方法等,实例如下

  1. <?php
  2. trait Cat{
  3. public function eat(){
  4. echo "This is Cat eat";
  5. }
  6. }
  7. trait Dog{
  8. use Cat;
  9. public function drive(){
  10. echo "This is Dog drive";
  11. }
  12. abstract public function getName();
  13. public function test(){
  14. static $num=0;
  15. $num++;
  16. echo $num;
  17. }
  18. public static function say(){
  19. echo "This is Dog say";
  20. }
  21. }
  22. class animal{
  23. use Dog;
  24. public function getName(){
  25. echo "This is animal name";
  26. }
  27. }
  28. $animal = new animal();
  29. $animal->getName();
  30. echo "<br/>";
  31. $animal->eat();
  32. echo "<br/>";
  33. $animal->drive();
  34. echo "<br/>";
  35. $animal::say();
  36. echo "<br/>";
  37. $animal->test();
  38. echo "<br/>";
  39. $animal->test();
  40. ?>

输出如下

作者:依恋灬
链接:https://www.jianshu.com/p/fc053b2d7fd1
來源:简书
简书著作权归作者所有,任何形式的转载都请联系作者获得授权并注明出处。

PHP7之Trait详解的更多相关文章

  1. PHP中Trait详解及其应用

    w PHP中Trait详解及其应用 - 开发者日常 - SegmentFaulthttps://segmentfault.com/a/1190000008009455

  2. 02.PHP7.x编译详解

    #php7编译安装安装 ``` useradd -M -s /sbin/nologin www yum -y install openssl-devel bzip2-devel curl-devel ...

  3. PHP之Trait详解 转

    php从以前到现在一直都是单继承的语言,无法同时从两个基类中继承属性和方法,为了解决这个问题,php出了Trait这个特性 用法:通过在类中使用use 关键字,声明要组合的Trait名称,具体的Tra ...

  4. PHP之Trait详解

    php从以前到现在一直都是单继承的语言,无法同时从两个基类中继承属性和方法,为了解决这个问题,php出了Trait这个特性 用法:通过在类中使用use 关键字,声明要组合的Trait名称,具体的Tra ...

  5. Scala的Trait详解

    http://article.yeeyan.org/view/178378/358355

  6. PHP7中标量类型declare的用法详解

    这篇文章主要介绍了PHP7标量类型declare用法,结合实例形式分析了PHP7中标量类型declare的功能.特性与相关使用技巧,需要的朋友可以参考下 本文实例讲述了PHP7标量类型declare用 ...

  7. CentOS7编译安装php7.1配置教程详解

    这篇文章主要介绍CentOS7编译安装php7.1的过程和配置详解,亲测 ,需要的朋友可以参考. 1.首先安装依赖包: yum install libxml2 libxml2-devel openss ...

  8. PHP写在线视频直播技术详解

    2016年7月22日 22:26:45 交流QQ:903464207 本文会不断更新 废话一句,如果你要做高性能服务器服务,请去读底层的东西 http tcp/ip socket 了解基础协议,你对如 ...

  9. Scala 深入浅出实战经典 第78讲:Type与Class实战详解

    王家林亲授<DT大数据梦工厂>大数据实战视频 Scala 深入浅出实战经典(1-87讲)完整视频.PPT.代码下载: 百度云盘:http://pan.baidu.com/s/1c0noOt ...

随机推荐

  1. 2019 CSP-J复赛游记

    不出行?不出行考屁呢? 今天的CSP-J似乎比去年简单了一些,可它... 好了,来说一说我的情况. T1:太水,5分钟秒 T2:这个数据有点尴尬,双重循环铁定爆,用链表有有一点小题大做.本蒟蒻在考场上 ...

  2. PinPoint使用教程

    选择该应用的展示边界 InBound:3 OutBound:3 基本概念 APM (Application Performance Management/应用性能管理)工具 为大规模分布式系统. 开发 ...

  3. yolov3

    YOLOv3没有太多的创新,主要是借鉴一些好的方案融合到YOLO里面.不过效果还是不错的,在保持速度优势的前提下,提升了预测精度,尤其是加强了对小物体的识别能力(yolov1在这方面是有缺陷的). 本 ...

  4. 015_matlab运行C语言

    视频教程:https://v.qq.com/x/page/q3039wsuged.html 资料下载:https://download.csdn.net/download/xiaoguoge11/12 ...

  5. 02_搭建HTTP客户端与服务器(数通华为)

    1.选择客户端和服务端: 2.服务端创建HTTP目录: 3.客户端访问下载:

  6. 为知笔记docker 版本运行

    最近为知提供了服务端的docker 运行,因为是全家桶,镜像偏大,但是使用还很不错,对于少于5人的可以免费使用 docker-compose 文件 version: "3" ser ...

  7. 使用Maven创建一个普通java项目

    1.创建项目: 使用Maven目的是是我们能够轻松的管理各种别人写过的包 创建好之后,我们去找我们所需要的包:在mvnrepository.com中找自己所需要的包 例子: 最后将依赖写入pom.xm ...

  8. SDU暑假排位第一场 (Gym - 100889)

    啊今天有点挂机啊 D题和队友暴力后发现一组数据跑得飞快 然后遇上1e5组数据就没了..... 然后我疯狂优化暴力 然后去世了 最后半小时F也没写出来 主要还是最后有点慌并且没有考虑清楚 导致情况越写越 ...

  9. 第04组Alpha事后诸葛亮

    一.组长博客:地址 二.Postmortem模板 设想和目标 1.我们的软件要解决什么问题?是否定义得很清楚?是否对典型用户和典型场景有清晰的描述? 我们要解决的问题是让大学生可以通过福鱼网站将暂时无 ...

  10. 【UVA1057】Routing

    [UVA1057]Routing 题面 洛谷 题解 有一个比较好想的dp就是\(f_{i,j}\)表示第一个点在\(i\),第二个点在\(j\)的最小点数,但是直接搞不好转移. 考虑建出反图,那么\( ...