Correction status:Uncorrected
Teacher's comments:
<?php /** * Trait是什么? * 1.trait是为单继承语言量身定制的代码复用机制; * 2.之前可以通过函数或类来实现代码复用; * 3.trait可以简单的理解为一个类方法的集合,工作在父类与子类之间; * 4.但是trait不仅仅局限于方法集合,还支持抽象,静态与属性; * 5.当前类成员会覆盖trait类成员,而trait中的成员,又可以覆盖同名类成员 * 6.重要提示:trait不是类,不能实例化,切记切记 */ if(!class_exists('Person')) { class Person { protected $name; public function __construct($name='王老五') { $this->name = $name; } public function study($coure='出差') { return $this->name .'在外地'.$coure; } } } //创建一个trait类,trait类不能够被实例化,只能够被类调用 //trait类:Coures if(!trait_exists('Coures')) { trait Coures { // trait中也可以创建属性 public $friend = '刘小刚'; public $coure = '出差'; public function sport($name = '10天') { return $this->name .'在外地'. $this->coure .'和'. $this->friend .'应酬'.$name; } //trait类中同样支持抽象,以及静态方法 //我把这个方法声明为抽象的同时,也声明为静态 abstract public static function hobby($name); //和Person类同名的方法,trait类会替换掉Person类中的同名方法 public function study($coure = '途中') { return $this->friend .'在回国的'. $coure; } } } //创建第二个trait类 //声明trait类:Recreation if(!trait_exists('Recreation')){ trait Recreation { //这个trait类中也声明一个与Course中同名的方法sport //注意: 属性$friend不允许与Course::sport()同名 //因为目前trait中还没有处理同名属性的机制,期待新版本会解决 //这里我们将$friend 修改为 $friend1 public $friend1='刘冰冰'; public function sport($name='007航班上') { // return $this->name.'在学习'.$name; //trait中可以访问父类中的属性 return $this->friend1 .'在回国的'. $name; } } } //以上有了父类和trait类,接下来创建一个子类 // Student子类 继承 Person父类 中所有的使用方法 class Student extends Person { // use Coures; //导入trait类,使用use //如果这二个trait类中有重名的方法,要用以下语句结构解决 use Coures, Recreation { //访问sport()方法冲突时,使用Coures::sport()代替掉Recoreation::sport() Coures::sport insteadof Recreation; //再访问Recoreation::sport()时启用别名 mySport() Recreation::sport as mySport; } //子类中必须实现trait中声明的抽象方法hobby() public static function hobby($name) { return $name; } } //实例化Student子类,这个类中有很多的方法,并将Student子类函数返回的结果保存在变量$student里 $student = new Student; //1.访问父类Person中的方法 echo '访问父类中的方法:'.$student->study(); echo "<hr>"; //2.访问trait类中的方法 echo $student->sport(); echo '<hr>'; //3调用trait中的抽象静态方法,必须要用Student来访问 echo Student::hobby('抽烟喝酒烫头'); echo '<hr>'; //4.当trait中存在与父类同名方法时,trait优先级要高 //如果当子类中存在与trait类同名方法时,子类优先级要高于trait类 echo $student->study(); echo '<hr>'; //5.子类可以从多个trait中获取方法集 echo '获取第一个trait类中的方法:'.$student->sport(); echo '<br>'; echo '获取第二个trait类中的方法:'.$student->mySport();
点击 "运行实例" 按钮查看在线实例
实例化效果图: