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

 

posted @ 2018-01-21 22:28  温柔的风  阅读(901)  评论(0编辑  收藏  举报