<?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>'; ?>
要理解子类中的$this->name是指父类中的$name,父类与trait中分别有同名函数优先调用trait中的函数