thinkPHP5.0框架引入Traits功能实例分析


Posted in PHP onMarch 18, 2017

本文实例讲述了thinkPHP5.0框架引入Traits功能。分享给大家供大家参考,具体如下:

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

Traits 是一种为类似 PHP 的单继承语言而准备的代码复用机制。Trait 为了减少单继承语言的限制,使开发人员能够自由地在不同层次结构内独立的类中复用方法集。Traits和类组合的语义是定义了一种方式来减少复杂性,避免传统多继承和混入类(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 操作符可以将其中一个冲突的方法以另一个名称来引入。

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

希望本文所述对大家基于ThinkPHP框架的PHP程序设计有所帮助。

PHP 相关文章推荐
PHP url 加密解密函数代码
Aug 26 PHP
PHP中fwrite与file_put_contents性能测试代码
Aug 02 PHP
php使用curl模拟登录后采集页面的例子
Nov 04 PHP
ThinkPHP3.1新特性之Action参数绑定
Jun 19 PHP
php将textarea数据提交到mysql出现很多空格的解决方法
Dec 19 PHP
php+mysql大量用户登录解决方案分析
Dec 29 PHP
php中session_id()函数详细介绍,会话id生成过程及session id长度
Sep 23 PHP
PHP的Yii框架的常用日志操作总结
Dec 08 PHP
Zend Framework入门之环境配置及第一个Hello World示例(附demo源码下载)
Mar 21 PHP
Smarty模板简单配置与使用方法示例
May 23 PHP
php通过文件头判断格式的方法
May 28 PHP
thinkPHP+phpexcel实现excel报表输出功能示例
Jun 06 PHP
2017年最新PHP经典面试题目汇总(上篇)
Mar 17 #PHP
thinkPHP5.0框架API优化后的友好性分析
Mar 17 #PHP
thinkPHP5.0框架配置格式、加载解析与读取方法
Mar 17 #PHP
thinkPHP5.0框架独立配置与动态配置方法
Mar 17 #PHP
PHP中类的自动加载的方法
Mar 17 #PHP
thinkPHP5.0框架简单配置作用域的方法
Mar 17 #PHP
thinkPHP5.0框架环境变量配置方法
Mar 17 #PHP
You might like
深入array multisort排序原理的详解
2013/06/18 PHP
Adnroid 微信内置浏览器清除缓存
2016/07/11 PHP
yii2.0实现创建简单widgets示例
2016/07/18 PHP
jQuery生成asp.net服务器控件的代码
2010/02/04 Javascript
js里怎么取select标签里的值并修改
2012/12/10 Javascript
javascript中的事件代理初探
2014/03/08 Javascript
使用jquery实现IE下按backspace相当于返回操作
2014/03/18 Javascript
用js传递value默认值的示例代码
2014/09/11 Javascript
基于NodeJS的前后端分离的思考与实践(一)全栈式开发
2014/09/26 NodeJs
用v-html解决Vue.js渲染中html标签不被解析的问题
2016/12/14 Javascript
详解vue.js移动端导航navigationbar的封装
2017/07/05 Javascript
使用mint-ui开发项目的一些心得(分享)
2017/09/07 Javascript
fetch 使用及如何接收JS传值
2017/11/11 Javascript
解决vue中post方式提交数据后台无法接收的问题
2018/08/11 Javascript
微信小程序webview与h5通过postMessage实现实时通讯的实现
2019/08/20 Javascript
vue+element-ui+axios实现图片上传
2019/08/20 Javascript
Vuex的API文档说明详解
2020/02/05 Javascript
[03:23]我的刀塔你不可能这么可爱 第一期金萌萌的故事
2014/06/20 DOTA
[04:40]2016国际邀请赛中国区预选赛全程TOP10镜头集锦
2016/07/01 DOTA
[03:18]【TI9纪实】社区大触GL与木木
2019/08/25 DOTA
推荐下python/ironpython:从入门到精通
2007/10/02 Python
详解python进行mp3格式判断
2016/12/23 Python
python3中int(整型)的使用教程
2017/03/23 Python
Python Django框架防御CSRF攻击的方法分析
2019/10/18 Python
浅析python中的del用法
2020/09/02 Python
H5仿微信界面教程(一)
2017/07/05 HTML / CSS
贝斯特韦斯特酒店集团官网:Best Western
2019/01/03 全球购物
Unix里面如何在后台运行程序
2016/10/14 面试题
家庭教育先进个人事迹材料
2014/01/24 职场文书
教师批评与自我批评(群众路线)
2014/10/15 职场文书
离婚协议书格式
2015/01/26 职场文书
穷人该怎么创业?谨记以下几点
2019/07/11 职场文书
详解MySQL事务的隔离级别与MVCC
2021/04/22 MySQL
Python如何把不同类型数据的json序列化
2021/04/30 Python
关于React Native 无法链接模拟器的问题
2021/06/21 Javascript
详解Vue项目的打包方式(生成dist文件)
2022/01/18 Vue.js