博客列表 >507创建trait实例,实现代码复用

507创建trait实例,实现代码复用

1A7498的博客
1A7498的博客原创
2018年05月11日 17:36:08812浏览
<?php
if(!class_exists('Play'))
{
    class Play
    {
        protected $name;
        public function __construct($name='小白')
        {
            $this->name=$name;
        }
        public function game($game='游戏')
        {
            return $this->name.'玩'.$game;
        }
    }
}
if(!class_exists('Listen'))
{
    trait Listen//trait可以访问父类中的属性
    {
        public $friend = '小名';
        public function hobby($name='php')
        {
            return $this->name.'和'.$this->friend.'在学习'.$name;
            //$this->name是指父类中的小白
            //$this->friend是指trait类中的小名
        }
        public function music($music='音乐')
        {
            return $this->name.'喜欢听'.$music;
        }
        //和父类同名的方法
        public function game($game = 'LOL')
        {
            return $this->name.'在玩'.$game;
        }
    }
}
class Student extends Play
{
    //导入trait
    use Listen;
}

if(!class_exists('Study'))
{
    class Study
    {
        use Listen;
        private $name;
        public function __construct($name)
        {
            $this->name = $name;
        }
        public function __get($name)
        {
            return $this->$name;
        }
    }
}
$play = new Play();//实例化Play
echo $play->game().'<hr>';//直接调用父类


//因为父类与trait中分别有同名的study()方法
//子类调用study()方法时,会优先调用trait中的study()方法
$student = new Student();
echo $student->game().'<br>';
echo $student->music().'<br>';
echo $student->hobby().'<hr>';

//调用trait类中的函数方法,实现代码复用
$study = new Study('小军');
echo $study->game('cs').'<br>';
echo $study->music('jay').'<br>';
echo $study->hobby('看电影').'<hr>';

?>

QQ截图20180511173347.png

要理解子类中的$this->name是指父类中的$name,父类与trait中分别有同名函数优先调用trait中的函数






声明:本文内容转载自脚本之家,由网友自发贡献,版权归原作者所有,如您发现涉嫌抄袭侵权,请联系admin@php.cn 核实处理。
全部评论
文明上网理性发言,请遵守新闻评论服务协议