#### 使用trait
trait是一种为类似 PHP 的单继承语言而准备的代码复用机制。trait为了减少单继承语言的限制,使开发人员能够自由地在不同层次结构内独立的类中复用方法集。trait和类组合的语义是定义了一种方式来减少复杂性,避免传统多继承和混入类(Mixin)相关的典型问题。
如果你没有继承系统的控制器基类,但是又希望能使用think\Controller控制器基类的一些方法,可以引入trait。
~~~
<?php
namespace app\index\controller;
class Index
{
use \traits\controller\Jump;
public function hello()
{
return 'hello';
}
}
~~~
引入`trait`的方式用的也是`use语法`,但和引入类完全不同,建议规范是在类的主体代码开头引入`trait`。
现在我们可以直接使用`\traits\controller\Jump`中定义的方法,包括`success/error/result/redirect`(后续我们会专门提到这些方法)。
由于`PHP5.4`版本不支持`trait`的自动加载,因此如果是`PHP5.4版本`,必须手动导入`trait类库`,系统提供了一个助手函数`load_trait`,用于自动加载`trait类库`,例如,可以这样正确引入`trait类库`。
~~~
<?php
namespace app\index\controller;
load_trait('controller/Jump');
class Index
{
use \traits\controller\Jump;
public function hello()
{
return 'hello';
}
}
~~~
在`PHP5.5+`版本中不要重复使用`load_trait`和`use`加载`trait`,以免造成错误。
一个类中可以引入多个`trait`,更多的关于`trait`内容可以参考PHP官方手册。
用例:
![](https://box.kancloud.cn/4605278df8d19befc65963608d08bd1c_1144x571.png)
~~~
<?php
namespace app\index\controller\traits;
use think\Debug;
trait CurlRequest
{
protected $model;
/**
* 清空表复位主键序号
*
* @return void
*/
public function clearTbl()
{
$this->model->clearTbl();
$rtn['success'] = true;
_callback($rtn);
}
}
~~~
引用:
~~~
<?php
namespace app\index\controller;
use app\common\controller\Base;
use app\index\model\Retention as RetentionModel;
/**
* 留存日志
*/
class Retention extends Base
{
use \app\index\controller\traits\CurlRequest;
protected $model;
/**
* 控制器初始化
* @return void
*/
public function _initialize()
{
//基类授权
//
parent::_initialize();
$this->model = new RetentionModel();
}
}
~~~