Traits引入

ThinkPHP 5.0开始采用trait功能(PHP5.4+)来作为一种扩展机制,可以方便的实现一个类库的多继承问题。

trait是一种为类似 PHP 的单继承语言而准备的代码复用机制。trait为了减少单继承语言的限制,使开发人员能够自由地在不同层次结构内独立的类中复用方法集。trait和类组合的语义是定义了一种方式来减少复杂性,避免传统多继承和混入类(Mixin)相关的典型问题。

但由于PHP5.4版本不支持trait的自动加载,因此如果是PHP5.4版本,必须手动导入trait类库,系统提供了一个助手函数load_trait,用于自动加载trait类库,例如,可以这样正确引入trait类库。

namespace app\index\controller;

load_trait('controller/Jump');  // 引入traits\controller\Jump

class index
{
use \traits\controller\Jump; public function index()
{
$this->assign('name','value');
$this->show('index');
}
}

如果你的PHP版本大于5.5的话,则可以省略load_trait函数引入trait

namespace app\index\controller;

class index
{
use \traits\controller\Jump; public function index()
{ }
}

可以支持同时引入多个trait类库,例如:

namespace app\index\controller;

load_trait('controller/Other');
load_trait('controller/Jump'); class index
{
use \traits\controller\Other;
use \traits\controller\Jump; public function index()
{ }
}

或者使用

namespace app\index\controller;

load_trait('controller/Other');
load_trait('controller/Jump'); class index
{
use \traits\controller\Other,\traits\controller\Jump; public function index()
{ }
}

系统提供了一些封装好的trait类库,主要是用于控制器和模型类的扩展。这些系统内置的trait类库的根命名空间采用traits而不是trait,是为了避免和系统的关键字冲突。

trait方式引入的类库需要注意优先级,从基类继承的成员将被 trait 插入的成员所覆盖。优先顺序是来自当前类的成员覆盖了 trait的方法,而 trait则覆盖了被继承的方法。

trait类中不支持定义类的常量,在trait中定义的属性将不能在当前类中或者继承的类中重新定义。

冲突的解决

我们可以在一个类库中引入多个trait类库,如果两个trait都定义了一个同名的方法,如果没有明确解决冲突将会产生一个致命错误。

为了解决多个trait在同一个类中的命名冲突,需要使用 insteadof操作符来明确指定使用冲突方法中的哪一个。

以上方式仅允许排除掉其它方法,as操作符可以将其中一个冲突的方法以另一个名称来引入。

更多的关于trait内容可以参考PHP官方手册

 
 

tinkphp5.0 traits 的引入的更多相关文章

  1. tinkphp5.0目录结构说明

    tinkphp5.0目录结构说明 project 应用部署目录 ├─application 应用目录(可设置) │ ├─common 公共模块目录(可更改) │ ├─index 模块目录(可更改) │ ...

  2. Android 7.0 PopupWindow 又引入新的问题,Google工程师也不够仔细么

    Android7.0 PopupWindow的兼容问题   Android7.0 中对 PopupWindow 这个常用的控件又做了一些改动,修复了以前遗留的一些问题的同时貌似又引入了一些问题,本文通 ...

  3. 关于android studio3.0版本后引入资源问题error: failed linking file resources

    最近更新阿里短视频的SDK,导入demo项目时,发现两个问题: 1.频繁报错AAPT2 error: file not found.以为直接Sync重新编译就可以,但是仍旧频繁提醒引入资源错误. 查找 ...

  4. vue-cli 3.0按需引入element-ui

    vue-cli 3.0脚手架初始化项目成功后,如果需要按需引入element-ui,按照官网的教程,会报如下错误: 这个是由于babel编译插件版本问题,需要安装最新的babel编译插件“@babel ...

  5. vue2.0+按需引入element-ui报错

    项目使用vue脚手架自动生成的,vue版本为^2.5.16.项目中需要按需使用element-ui,根据element-ui的官方文档,一开始在babel.config.js文件中修改配置 modul ...

  6. springBoot2.0使用@ImportResource引入spring配置文件.xml

    1. 编写spring配置文件.xml 这里是bean.xml <?xml version="1.0" encoding="UTF-8"?> < ...

  7. Sentinel 1.5.0 正式发布,引入 Reactive 支持

    近日,流控降级组件 Sentinel 的又一个里程碑版本 1.5.0 正式发布. 该版本引入 Reactive 的支持,并提供多项新特性与改进.从 1.5.0 版本开始,Sentinel 仅支持 JD ...

  8. AndroidStudio 0.2.x 引入多模块Eclipse项目

    !!!!太他妈的累人了!整整折腾了两天!!!!!!! 不知从那个版本开始ImportModule... 从AndroidStudio的File菜单中消失了,在0.2之前的版本作为library的模块可 ...

  9. vue2.0 样式表引入的方法 css sass less

    在引入样式之前,首先要了解static.assets两个文件夹的区别. 从字面上可以看出,static用来存放静态文件,assets用来存放资源文件: static存放的文件不会被编译,打包后直接赋值 ...

随机推荐

  1. LeetCode OJ 142. Linked List Cycle II

    Given a linked list, return the node where the cycle begins. If there is no cycle, return null. Note ...

  2. utf8 文件 错误保存为gbk 中文乱码 解决方法

    用zend studio  将utf-8 格式的文件 保存为 gbk 了,之后无论怎么装换 中文都是乱码 用 beyond compare(文件比较工具 对编码支持的比较强大) 打开,改下编码,中文就 ...

  3. 脚本添加crontab任务【转】

    今天朋友问,计划任务是用crontab -e来添加的,如何使用脚本来添加呢? 在执行crontab -e命令时,会在/var/spool/cron目录下创建一个文件,文件的名称是你当前的用户名,内容就 ...

  4. WebForm(aspx,cs,dll之间的关系)

    WebForm分为两个文件aspx和aspx.cs,aspx是页面模板,是页面描述文件,就是html的内容,和aspx结合的更好,不用像一开始那样程序员自己去填充模板,控件都是定义在aspx中,内联的 ...

  5. PreferenceActivity详解

    为了引入这个概率 首先从需求说起 即:现有某Activity专门用于手机属性设置 那么应该如何做呢? 根据已学知识 很快一个念头闪过 即:Activity + Preference 组合 前者用于界面 ...

  6. HDU 5965 三维dp 或 递推

    题意:= =中文题 思路一:比赛时队友想的...然后我赛后想了一下想了个2维dp,但是在转移的时候,貌似出了点小问题...吧?然后就按照队友的思路又写了一遍. 定义dp[i][j][k],表示第i列, ...

  7. Windows GTK+ 环境搭建(详解)

    来源:http://blog.sina.com.cn/s/blog_a6fb6cc901017ygy.html Windows GTK+ 环境搭建 最近要做界面的一些东西,但是对微软提供的类库MFC不 ...

  8. javascript string去除两边空格

    function trim(){ return this.replace(/(^\s*)|(\s*$)/g,""); g整个字符串 }

  9. hadoop native

    http://blog.csdn.net/benben85/article/details/4161134 http://stackoverflow.com/questions/19943766/ha ...

  10. LA2965 n个数中选出最多个数异或和为0

    intput n 1<=n<=24 n串只有大写字母的字符串 output 选出最多个字符串且每个大写字母出现的次数为偶数 第一行输出个数x 第二行输出x个字符串的下标 做法:将每个字符串 ...