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 相关文章推荐
让你同时上传 1000 个文件 (二)
Oct 09 PHP
使PHP自定义函数返回多个值
Nov 26 PHP
PHP发明人谈MVC和网站设计架构 貌似他不支持php用mvc
Jun 04 PHP
PHP实现采集中国天气网未来7天天气
Oct 15 PHP
thinkphp四种url访问方式详解
Nov 28 PHP
SSO单点登录的PHP实现方法(Laravel框架)
Mar 23 PHP
php nginx 实时输出的简单实现方法
Jan 21 PHP
PHP以json或xml格式返回请求数据的方法
May 31 PHP
PHP实现的抓取小说网站内容功能示例
Jun 27 PHP
php+jQuery ajax实现的实时刷新显示数据功能示例
Sep 12 PHP
PHP 进程池与轮询调度算法实现多任务的示例代码
Nov 26 PHP
PHP设计模式(八)装饰器模式Decorator实例详解【结构型】
May 02 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
MySQL数据库转移,access,sql server 转 MySQL 的图文教程
2007/09/02 PHP
php连接Access数据库错误及解决方法
2013/06/20 PHP
windows下配置apache+php+mysql时出现问题的处理方法
2014/06/20 PHP
php匹配字符中链接地址的方法
2014/12/22 PHP
WordPress中重置文章循环的rewind_posts()函数讲解
2016/01/11 PHP
php从数据库读取数据,并以json格式返回数据的方法
2018/08/21 PHP
PHP 超级全局变量相关总结
2020/06/30 PHP
js+css简单实现网页换肤效果
2015/12/29 Javascript
jQuery实现将div中滚动条滚动到指定位置的方法
2016/08/10 Javascript
手机端图片缩放旋转全屏查看PhotoSwipe.js插件实现
2016/08/25 Javascript
js基本算法:冒泡排序,二分查找的简单实例
2016/10/08 Javascript
微信小程序-图片、录音、音频播放、音乐播放、视频、文件代码实例
2016/11/22 Javascript
用POSTMAN发送JSON格式的POST请求示例
2018/09/04 Javascript
Vue实现table上下移动功能示例
2019/02/21 Javascript
Node.js中Koa2在控制台输出请求日志的方法示例
2019/05/02 Javascript
Vue.use()在new Vue() 之前使用的原因浅析
2019/08/26 Javascript
JavaScript ES6 Class类实现原理详解
2020/05/08 Javascript
浅谈vue中$bus的使用和涉及到的问题
2020/07/28 Javascript
vue和H5 draggable实现拖拽并替换效果
2020/07/29 Javascript
[01:04]不如跳舞!DOTA2新英雄玛尔斯的欢乐日常
2019/03/11 DOTA
[03:11]不朽宝藏三外观展示
2020/09/18 DOTA
[37:29]完美世界DOTA2联赛PWL S2 LBZS vs Forest 第二场 11.19
2020/11/19 DOTA
python实现视频分帧效果
2019/05/31 Python
Python使用Pandas库实现MySQL数据库的读写
2019/07/06 Python
Django ORM 常用字段与不常用字段汇总
2019/08/09 Python
numpy:找到指定元素的索引示例
2019/11/26 Python
css3中单位px,em,rem,vh,vw,vmin,vmax的区别及浏览器支持情况
2016/12/06 HTML / CSS
详解HTML5中的Communication API基本使用方法
2016/01/29 HTML / CSS
幼儿教育感言
2014/02/05 职场文书
经济担保书范文
2014/04/02 职场文书
人力资源管理专业自荐信
2014/06/24 职场文书
教师节横幅标语
2014/10/08 职场文书
地方白酒代理协议书
2014/10/25 职场文书
家庭教育教师培训学习体会
2016/01/14 职场文书
Python如何配置环境变量详解
2021/05/18 Python
聊聊redis-dump工具安装问题
2022/01/18 Redis