实例演示explain trait的新特性的功能
自PHP5.4.0起,PHP实现了一种代码复用的方法,称之为Trait;Trait可以看做是类的实现部分,Trait为php单继承限制,提供了一套灵活的代码复用机制;
Trait的功能:
- 实现代码的复用;
- 实现扩展功能;
- PHP提供了相应的trait命名冲突解决方案;
- trait 与接口interface 组合使用;
trait 功能1:实现代码的复用 实例演示:
// trait 功能1:实现代码的复用
trait show{
public function show(){
printf('<pre>%s</pre>',print_r(get_class_vars(__CLASS__),true));
}
}
class one{
use show;
protected $name="胡歌";
protected $age="36";
}
$s=new one;
echo $s->show();
class two{
use show;
protected $name="山东";
protected $age="26";
}
$s=new two;
echo $s->show();
实现类的扩展功能 实例演示
<?php
// trait 实现类的扩展功能
// 添加两个方法,打印所有属性,打印所有的方法
trait demo1{
public function show(){
printf('<pre>%s</pre>',print_r(get_class_vars(__CLASS__),true));
}
}
trait demo2{
public function getMethod(){
printf('<pre>%s</pre>',print_r(get_class_methods(__CLASS__),true));
}
}
trait demo3{
use demo1,demo2;
}
class one{
use demo2;
public $fruit="西瓜柿";
public $prise="6元/斤";
public function getInfo(){
return $this->fruit.":".$this->prise;
}
}
$a=new one();
echo $a->getInfo();
echo $a->getMethod();
class two{
use demo1;
public $fruit="西瓜柿";
public $prise="6元/斤";
public function getInfo(){
return $this->fruit.":".$this->prise;
}
}
$a=new two();
echo $a->getInfo();
echo $a->show();
?>
trait 组合中命名冲突的解决方案 实例演示
<?PHP
// trait 组合中命名冲突的解决方案
trait demo1{
public function display(){
return __METHOD__;
}
}
trait demo2{
public function display(){
return __METHOD__;
}
}
trait demo3{
use demo2,demo1{
// 给demo2起个别名d2
demo2::display as d2;
// 调用demo1::display替换掉demo2::display
demo1::display insteadof demo2;
}
}
class work{
use demo3;
}
$work= new work();
var_dump($work);
echo "<br/>";
echo $work->display();
echo "<br/>";
echo $work->d2();
?>
trait与interface组合
<?PHP
// trait 功能4 trait与interface组合
interface iDemo{
public static function index();
}
trait Demo{
// 将接口方法中的抽象方法的实现过程交给trait来处理
public static function index(){
return __METHOD__;
}
}
// 工作类
class hello implements iDemo{
use Demo;
}
// 客户端
echo hello::index();
?>
Trait的优先级:
Trait,子类,父类中存在同名方法时,Trait在子类中调用,此时的优先级为:子类>trait>父类;
实例演示:
<?php
trait show{
public static function getAge(){
return __METHOD__;
}
}
class One{
public static function getAge(){
return __METHOD__;
}
}
class two extends One{
use show;
public static function getAge(){
return __METHOD__;
}
}
echo two::getAge();//two::getAge
?>