作为一种扩展机制,可以方便的实现一个类库的多继承问题。
trait是一种为类似 PHP 的单继承语言而准备的代码复用机制。trait为了减少单继承语言的限制,使开发人员能够自由地在不同层次结构内独立的类中复用方法集。trait和类组合的语义是定义了一种方式来减少复杂性,避免传统多继承和混入类(Mixin)相关的典型问题。
一句话总结:把重复的方法拆分到一个文件,通过 use 引入以达到代码复用的目的。
namespace app\index\controller;
load_trait('controller/Jump'); // 引入traits\controller\Jump
class index
{
use \traits\controller\Jump; //一个jump方法独立出来的,实现代码的复用
public function index()
{
$this->assign('name','value');
$this->show('index');
}
}
Trait 注意点
一、优先级
Trait 方法 > extends 方法 > 类方法
二、Trait 方法名冲突的解决
如下面的情况:
<?php
trait ta {
public function demo () {
echo 'ta';
}
}
trait tb {
public function demo () {
echo 'tb';
}
}
class A {
use ta,tb;
}
$a = new A();
$a->demo();
运行会报错:
PHP Fatal error: Trait method demo has not been applied, because there are collisions with other trait methods on A
Trait 方法名冲突了,解决方法有下:
insteadof
class A {
use ta,tb {
tb::demo insteadof ta;
}
}
运行结果:
tb
tb::demo insteadof ta 这句代码的意思就是用 tb 中的 demo 方法替代 ta 中的 demo 方法。