在PHP面向对象概念编程中,一个子类只能继承一个父类,但是从php5.4后新增traits实现代码复用机制变向达到多继承。Trait 为了减少单继承语言的限制,使开发人员能够自由地在不同层次结构内独立的类中复用方法集。

1、trait和类相似,但不能被实例化,无需继承,只需要在类中使用关键词use引入即可,可引入多个traits,用','隔开
2、trait会覆盖继承的方法,当前类会覆盖trait方法

<?php
class People{
public function walk(){
echo "步行....";
}
function say(){
echo "说话<br/>";
}
}
trait Woman{
public function eat(){
echo "女人吃饭<br/>";
} public function dance(){
echo "女人跳舞<br/>";
}
}
trait Man{
public function walk(){
parent::walk();
echo "继续步行...<br/>";
} public function say(){
echo "男人说话<br/>";
}
public function sing(){
echo "男人唱歌<br/>";
}
} class Child extends People{
use Man,Woman; public function sing(){
echo "小孩唱歌<br/>";
}
public function dance(){
echo "小孩跳舞<br/>";
} } $obj=new Child();
$obj->walk();
$obj->eat();
$obj->say();
$obj->sing();
$obj->dance();
步行....继续步行...
女人吃饭
男人说话
小孩唱歌
小孩跳舞

补充:

如果两个 trait 都插入了一个同名的方法,如果没有明确解决冲突将会产生一个致命错误。
为了解决多个 trait 在同一个类中的命名冲突,需要使用 insteadof 操作符来明确指定使用冲突方法中的哪一个。
以上方式仅允许排除掉其它方法,as 操作符可以将其中一个冲突的方法以另一个名称来引入。

<?php
class People{
public function walk(){
echo "步行....";
}
function say(){
echo "说话<br/>";
}
}
trait Woman{
public function eat(){
echo "女人吃饭<br/>";
}
public function say(){
echo "女人说话<br/>";
} public function dance(){
echo "女人跳舞<br/>";
}
}
trait Man{
public function walk(){
parent::walk();
echo "继续步行...<br/>";
}
public function eat(){
echo "男人吃饭<br/>";
}
public function say(){
echo "男人说话<br/>";
}
public function sing(){
echo "男人唱歌<br/>";
}
} class Child extends People{
use Man,Woman {
Man::eat insteadof Woman;
Woman::say insteadof Man;
} public function sing(){
echo "小孩唱歌<br/>";
}
public function dance(){
echo "女人跳舞<br/>";
} } $obj=new Child();
$obj->walk();
$obj->eat();
$obj->say();
$obj->sing();
$obj->dance();
步行....继续步行...
男人吃饭
女人说话
小孩唱歌
女人跳舞

最新文章

  1. YYModel 源码解读(二)之YYClassInfo.h (2)
  2. Java中的链表数据结构
  3. SDUST 软件工程2016-作业4-A 百钱买鸡问题
  4. [rxjs] Async, handle data over time
  5. Razor的理解
  6. 垃圾回收算法简单介绍——JVM读书笔记&amp;lt;二&amp;gt;
  7. MySQL 关闭FOREIGN_KEY_CHECKS检查
  8. Algorithm 学习环境准备
  9. iOS------自动查找项目中不用的图片资源
  10. 在Amazon FreeRTOS V10中使用运行时统计信息
  11. 89. Gray Code返回位运算的所有生成值
  12. canal 配置
  13. 【Python】Flask系列-URL和视图笔记
  14. HDU 1234 (浙大计算机研究生复试上机考试-2005年) 开门人和关门人 (水)
  15. MYSQL数据库建表注意事项
  16. Ubuntu 安装 Elasticsearch
  17. 关于AWS的备份策略
  18. [P1860]新魔法药水
  19. Composer切换到Laravel-China 镜像
  20. Hush Framework框架配置(转)

热门文章

  1. Python查询数据库时候遇到的乱码问题
  2. Sencha Cmd创建Ext JS示例项目
  3. php面向对象基础概念(封装)
  4. LeetCode——Single Number III
  5. 存储总量达20T的MySQL实例,如何完成迁移?
  6. 【BZOJ4337】BJOI2015 树的同构 括号序列
  7. 把 Activity 改成 ListActivity继续使用 setContentView
  8. CHECKSUM比较两表字段值差异
  9. Centos6.8 防火墙设置
  10. C++和C#的思考