#### 使用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官方手冊。
用例:

~~~
<?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();
}
}
~~~