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

 

原创文章,作者:ItWorker,如若转载,请注明出处:https://blog.ytso.com/tech/pnotes/17142.html

(0)
上一篇 2021年7月19日 19:55
下一篇 2021年7月19日 19:55

相关推荐

发表回复

登录后才能评论