Blogger Information
Blog 55
fans 0
comment 0
visits 30716
Popular Tutorials
More>
Latest Downloads
More>
Web Effects
Website Source Code
Website Materials
Front End Template
5月7日作业
老专的博客
Original
456 people have browsed it

5月7日作业

用 Trait 复制代码,介于父类和子类之间, 应该可应用于外来类和自己写的类之间作为标准类。

代码:

实例

<?php
echo '<h2>作业:Trait 代码复用方法 </h2>';

//声明父类: Factory

class Factory{
    protected $worker;

    public function __construct($worker='李梅'){
        $this->worker = $worker;
    }

    public function work($part='风机'){
        return $this->name.'在制作'.$part;
    }        
}  

//声明trait类:WorkShop 车间

trait WorkShop{
    //trait中也可以自己的属性
    public $worker1='王虎';
    public function sport($made='电脑'){
        //trait中可以访问父类中的属性
        return $this->worker.'和'.$this->worker1.'在学习'.$made;
    } 

    //trait中同样支持抽象,以及静态方法,我放在一起写了
    //我把这个方法声明为抽象的同时,也声明为静态
    abstract public static function hobby($name);

    //在trait中也声明一个与父类同名的work()方法,参数修改一下以示区别
    public function work($part='电焊机'){
        return $this->worker1.'在学习安装'.$made;
    }
}

//声明trait类:Recreation 娱乐
trait Recreation{
    //这个trait类中也声明一个与WorkShop中同名的方法sport
    //注意: 属性$worker1不允许与WorkShop::sport()同名
    //因为目前trait中还没有处理同名属性的机制,期待新版本会解决
    //这里我们将$worker1 修改为 $worker2
    public $worker2='王虎';
    public function sport($name='空调机'){
        //return $this->name.'在学习'.$name;
        //trait中可以访问父类中的属性
        return $this->worker.'和'.$this->worker2.'在学习'.$name;
    }         
}

//声明子类: Team ,继承自父类: Factory
class Team extends Factory{
    //导入trait类
    //use WorkShop;
    //子类支持导入多个trait类,但不可避免的会遇到方法重名问题,怎么解决呢?
    //use WorkShop, Recreation;  //同时引入二个trait类
    //如果这二个trait类中有重名方法,要用以下语句结构解决
    use WorkShop, Recreation {
        //访问sport()方法冲突时,使用Course::sport()代替掉Recoreation::sport()
        WorkShop::sport insteadof Recreation;
       
        //再访问Recoreation::sport()时启用别名 mySport()
        Recreation::sport as mySport;
    }
    
    //子类中必须实现trait中声明的抽象方法hobby()
    public static function hobby($name){
        return $name;
    }
    
    //在子类中再声明一个与trait类同名的work()方法,参数修改一下以示区别
    public function work($part='空压机'){
        return $this->worker1.'在学习'.$part;
    }    
}
echo '<hr color="red" size=3>';
//实例化Student类
$team = new Team();

//1.访问父类Factory中的方法
echo $team->work();
echo '<hr>';

//2.访问trait类中的方法
echo $team->sport();
echo '<hr>';

//3调用trait中的抽象静态方法,必须要用Student来访问
echo team::hobby('看书、旅游');
echo '<hr>';

//4.当trait中存在与父类同名方法时,trait优先级要高
echo $team->work();
echo '<hr>';

//5.当子类中存在与trait类同名方法时,子类优先级要高
echo $team->work();
echo '<hr>';

//6.子类可以从多个trait中获取方法集
echo $team->sport();
echo '<hr>';
echo $team->mySport();

运行实例 »

点击 "运行实例" 按钮查看在线实例

代码运行图片:

51.png

Correction status:Uncorrected

Teacher's comments:
Statement of this Website
The copyright of this blog article belongs to the blogger. Please specify the address when reprinting! If there is any infringement or violation of the law, please contact admin@php.cn Report processing!
All comments Speak rationally on civilized internet, please comply with News Comment Service Agreement
0 comments
Author's latest blog post