php面向对象多继承实现
在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();
步行....继续步行...
男人吃饭
女人说话
小孩唱歌
女人跳舞
php面向对象多继承实现的更多相关文章
- 黑马程序员_Java面向对象2_继承
4.面向对象_继承 4.1继承的概述 提高了代码的复用性. 让类与类之间产生了关系,有了这个关系,才有多态的特性. 注意:千万不要为了获取其他类的功能而去继承,简化代码而继承.必须是类与类之间有所属关 ...
- C++ Primer 学习笔记_69_面向对象编程 --继承情况下的类作用域
面向对象编程 --继承情况下的类作用域 引言: 在继承情况下,派生类的作用域嵌套在基类作用域中:假设不能在派生类作用域中确定名字,就在外围基类作用域中查找该名字的定义. 正是这样的类作用域的层次嵌套使 ...
- 【Java基础】【08面向对象_继承&方法&final】
08.01_面向对象(代码块的概述和分类)(了解)(面试的时候会问,开发不用或者很少用) A:代码块概述 在Java中,使用{}括起来的代码被称为代码块. B:代码块分类 根据其位置和声明的不同,可以 ...
- php面向对象 封装继承多态 接口、重载、抽象类、最终类总结
1.面向对象 封装继承多态 接口.重载.抽象类.最终类 面向对象 封装继承多态 首先,在解释面向对象之前先解释下什么是面向对象? [面向对象]1.什么是类? 具有相同属性(特征)和方法(行为)的一 ...
- 面向对象多继承(c3算法)、网络基础和编写网络相关的程序
一.面向对象多继承(c3算法) a.有多个父类先找左,再找右,如下示例: class A(object): pass class B(object): def f1(self): print('B') ...
- Python 面向对象编程 继承 和多态
Python 面向对象编程 继承 和多态 一:多继承性 对于java我们熟悉的是一个类只能继承一个父类:但是对于C++ 一个子类可以有多个父亲,同样对于 Python一个类也可以有多个父亲 格式: c ...
- python之面向对象(继承)
类的继承 python之面向对象(继承) 面向对象的编程带来的主要好处之一是代码的重用,实现这种重用的方法之一是通过继承机制.继承完全可以理解成类之间的类型和子类型关系. 需要注意的地方:继承语法 c ...
- python面向对象编程 继承 组合 接口和抽象类
1.类是用来描述某一类的事物,类的对象就是这一类事物中的一个个体.是事物就要有属性,属性分为 1:数据属性:就是变量 2:函数属性:就是函数,在面向对象里通常称为方法 注意:类和对象均用点来访问自己的 ...
- Py修行路 python基础 (十五)面向对象编程 继承 组合 接口和抽象类
一.前提回忆: 1.类是用来描述某一类的事物,类的对象就是这一类事物中的一个个体.是事物就要有属性,属性分为 1:数据属性:就是变量 2:函数属性:就是函数,在面向对象里通常称为方法 注意:类和对象均 ...
- python语法学习面向对象之继承
python语法学习面向对象之继承 转载自:http://www.cnblogs.com/Joans/archive/2012/11/09/2757368.html 只要涉及到面向对象,”类“是必须出 ...
随机推荐
- coreseek/sphinx CentOS6.4下安装
一.在CentOS6.4下安装coreseek之前需要预先安装以下软件 1.打开终端 输入 su 获取管理员权限 2.输入命令 yum install make gcc g++ gcc-c++ lib ...
- background-clip和background-origin
background-clip 修剪:背景颜色从哪些区域开始显示,默认从border开始该属性指定了背景在哪些区域可以显示,但与背景开始绘制的位置无关,背景的绘制的位置可以出现在不显示背景的区域,这时 ...
- js如何判断不同的操作系统
<html> <head> <title>判断操作系统</title> <script type="text/javascript&qu ...
- Weinre 远程调试移动端手机web页面
调试场景 1.调试页面在手机上.2.调试工具在PC的chrome3.手机跟pc要在同一个网络环境下,也就是都使用一个wifi 一.安装 Weinre 1.Weinre是基于nodejs实现的,所以使用 ...
- Video如何不自动全屏播放?
知乎:微信内置浏览器 如何小窗不全屏播放视频? 目前在微信中只能全屏播放,只有加入腾讯白名单的视频才能小屏播放. 知乎上讨论的解决方案尚未测试,太麻烦了.
- 【BZOJ3631】松鼠的新家 树链剖分
BZOJ3631 松鼠的新家 Description 松鼠的新家是一棵树,前几天刚刚装修了新家,新家有n个房间,并且有n-1根树枝连接,每个房间都可以相互到达,且俩个房间之间的路线都是唯一的.天哪,他 ...
- oracle rank()和dense_rank(), row_number() 的区别
转自:http://www.linuxidc.com/Linux/2015-04/116349.htm 假设现在有一张学生表student,学生表中有姓名.分数.课程编号,现在我需要按照课程对学生的成 ...
- 最小生成树的变形(次小生成树hdu4081)
hdu4081 Qin Shi Huang's National Road System Time Limit: 2000/1000 MS (Java/Others) Memory Limit: ...
- Mybatis 搭配 阿里druid连接池 连接 oracle 或 mysql
DRUID介绍 DRUID是阿里巴巴开源平台上一个数据库连接池实现,它结合了C3P0.DBCP.PROXOOL等DB池的优点,同时加入了日志监控,可以很好的监控DB池连接和SQL的执行情况,可以说是针 ...
- postgresql----ANY/SOME&&ALL
一.ANY/SOME WHERE expression operator ANY (subquery)WHERE expression operator SOME (subquery) 其实ANY和S ...