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();
步行....继续步行...
男人吃饭
女人说话
小孩唱歌
女人跳舞