php从以前到现在一直都是单继承的语言,无法同时从两个基类中继承属性和方法,为了解决这个问题,php出了Trait这个特性

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

如下代码实例:

<?php
trait Dog{public $name="dog";public function bark(){echo "This is dog";}
}
class Animal{public function eat(){echo "This is animal eat";}
}
class Cat extends Animal{use Dog;public function drive(){echo "This is cat drive";}
}
$cat = new Cat();
$cat->drive();
echo "<br/>";
$cat->eat();
echo "<br/>";
$cat->bark();
?>

将会如下输出

This is cat drive
This is animal eat
This is dog 

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

<?php
trait Dog{public $name="dog";public function drive(){echo "This is dog drive";}public function eat(){echo "This is dog eat";}
}class Animal{public function drive(){echo "This is animal drive";}public function eat(){echo "This is animal eat";}
}class Cat extends Animal{use Dog;public function drive(){echo "This is cat drive";}
}
$cat = new Cat();
$cat->drive();
echo "<br/>";
$cat->eat();

如下显示

This is cat drive
This is dog eat

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

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

use trait1,trait2

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

如下实例:

<?php
trait trait1{public function eat(){echo "This is trait1 eat";}public function drive(){echo "This is trait1 drive";}
}
trait trait2{public function eat(){echo "This is trait2 eat";}public function drive(){echo "This is trait2 drive";}
}
class cat{use trait1,trait2{trait1::eat insteadof trait2;trait1::drive insteadof trait2;}
}
class dog{use trait1,trait2{trait1::eat insteadof trait2;trait1::drive insteadof trait2;trait2::eat as eaten;trait2::drive as driven;}
}
$cat = new cat();
$cat->eat();
echo "<br/>";
$cat->drive();
echo "<br/>";
echo "<br/>";
echo "<br/>";
$dog = new dog();
$dog->eat();
echo "<br/>";
$dog->drive();
echo "<br/>";
$dog->eaten();
echo "<br/>";
$dog->driven();
?>

输出如下

This is trait1 eat
This is trait1 driveThis is trait1 eat
This is trait1 drive
This is trait2 eat
This is trait2 driv

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

<?php
trait Animal{public function eat(){echo "This is Animal eat";}
}class Dog{use Animal{eat as protected;}
}
class Cat{use Animal{Animal::eat as private eaten;}
}
$dog = new Dog();
$dog->eat();//报错,因为已经把eat改成了保护$cat = new Cat();
$cat->eat();//正常运行,不会修改原先的访问控制
$cat->eaten();//报错,已经改成了私有的访问控制
?

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

<?php
trait Cat{public function eat(){echo "This is Cat eat";}
}trait Dog{use Cat;public function drive(){echo "This is Dog drive";}abstract public function getName();public function test(){static $num=0;$num++;echo $num;}public static function say(){echo "This is Dog say";}
}
class animal{use Dog;public function getName(){echo "This is animal name";}
}$animal = new animal();
$animal->getName();
echo "<br/>";
$animal->eat();
echo "<br/>";
$animal->drive();
echo "<br/>";
$animal::say();
echo "<br/>";
$animal->test();
echo "<br/>";
$animal->test();
?

输出如下

This is animal name
This is Cat eat
This is Dog drive
This is Dog say
1
2

以上就是我对trait的总结,如有错误,还望指正

作者:依恋灬

链接:https://www.jianshu.com/p/fc053b2d7fd1

来源:简书

简书著作权归作者所有,任何形式的转载都请联系作者获得授权并注明出处。

转载于:https://www.cnblogs.com/onew/p/11365507.html

PHP之Trait详解相关推荐

  1. php动态+trait,详解PHP神奇又有用的Trait

    php和java,c++一样都是单继承模式.但是像python,是支持多继承(即Mixin模式).那么如何在php中实现多继承模式?这就需要使用trait. trait Arrayabletrait{ ...

  2. 【转】PHP之Trait详解 以及 trait 冲突的解决 insteadof

    PHP之Trait学习!! (转)PHP之Trait详解 (转)trait 冲突的解决 insteadof

  3. Scala Trait详解

    为什么80%的码农都做不了架构师?>>>    除了从父类集成代码外,Scala中的类还允许从一个或者多个traits中导入代码. 对于Java程序员来说理解traits的最好方法就 ...

  4. php中访问控制_PHP之Trait详解

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

  5. Rust:Trait 详解

    Rust语言里不同的type(比如 struct, enum等)可以调用的函数主要包括本身实现的方法.此外,Rust也提供了trait来定义不同type所需的"common behavior ...

  6. Scala Trait 详解(实例)

    Trait基础 在Scala中,Trait是一种特殊概念.首先,Trait可以被作为接口来使用,此时Trait与Java的接口非常类似.同时在Trait可以定义抽象方法,其与抽象类中的抽象方法一样,不 ...

  7. php之新特性trait详解

    废话不多说了,直接进入主题吧. 为什么要使用它,使用它有什么好处: 开发人员能够自由地在不同层次结构内独立的类中复用 method,在一定程度上弥补了单继承语言在某些情况下代码不能复用的问题. 与普通 ...

  8. Rust 12: 面向对象详解(struct + impl + trait)

    文章目录 struct impl trait 扩展阅读 总结 struct关键字用于定义一个数据结构,可以类比为面向对象语言中的class. impl关键字可以为struct实现关联的成员方法. tr ...

  9. Scala进阶之路-面向对象编程之类的成员详解

    Scala进阶之路-面向对象编程之类的成员详解 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 一.Scala中的object对象及apply方法 1>.scala 单例对象 ...

  10. mysql 魔术设置_详解php魔术方法(Magic methods)的使用方法

    PHP中把以两个下划线__开头的方法称为魔术方法,这些方法在PHP中充当了举足轻重的作用. 魔术方法包括: __construct(),类的构造函数 __destruct(),类的析构函数 __cal ...

最新文章

  1. Caffe源码中layer文件分析
  2. CPU制作流程大揭密
  3. springMVC保存数据到mysql数据库中文乱码问题解决方法
  4. CDH5离线安装手册
  5. 道路交通实时流量监控预测系统(大讲台)
  6. 职场思想分享001 | 有多种选择才叫有能力
  7. 紧跟月影大佬的步伐,一起来学习如何写好JS(上)
  8. Pi network到底怎么样?我们来深入剖析一下
  9. 两条边延长角会有什么变化_叶片锁是什么样的 叶片锁使用方法【详解】
  10. 华为nova 5 Pro现身GeekBench数据库:妥妥麒麟980水准
  11. 怎么用php myadmin连接远程MYSQL数据库
  12. Undefined symbols for architecture i386:问题解决
  13. [BZOJ4756]Promotion Counting
  14. 三、系统分层和分割策略
  15. 天气暖和了,我却感冒了
  16. java基础 CAS算法的简单理解
  17. n1装linux系统升级,N1 降级刷机救砖总结
  18. mysql根据15位或者18位身份证号计算年龄的自定义函数
  19. 日常生活中的企业监控
  20. 使用GoLang开发游戏服务器(一)

热门文章

  1. 温故知新----css布局
  2. 台式电脑显示器黑屏但灯亮_显示器黑屏无信号 但电脑一直在运行的原因和解决办法...
  3. python elasticsearch dsl_python 查询 elasticsearch 常用方法(Query DSL)
  4. 安装高版本的java_运行“需要Java 11或更高版本”的Visual Studio代码。请下载并安装最新的JDK”...
  5. matlab怎么调出来的,如何调出MATLAB内部函数的源程序?
  6. pat A1052:Linked List Sorting静态链表+链表排序
  7. python机器学习搭建空气质量AQI(air quality index)预测模型
  8. MLOps- 吴恩达Andrew Ng Overview of the ML Lifecycle and Deployment Week1 论文等资料汇总
  9. 解决XCode运行app在模拟器上,提示模拟器不存在
  10. Swift 5 闭包Closure简明教程