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中通过curl模拟登陆discuz论坛的实现代码
Feb 16 PHP
php批量更改数据库表前缀实现方法
Oct 26 PHP
合并ThinkPHP配置文件以消除代码冗余的实现方法
Jul 22 PHP
destoon实现会员商铺中指定会员或会员组投放广告的方法
Aug 21 PHP
php中mkdir函数用法实例分析
Nov 15 PHP
PHP文件上传问题汇总(文件大小检测、大文件上传处理)
Dec 24 PHP
twig模板获取全局变量的方法
Feb 05 PHP
jquery+thinkphp实现跨域抓取数据的方法
Oct 15 PHP
Laravel框架路由设置与使用示例
Jun 12 PHP
PHP实现的多维数组去重操作示例
Jul 21 PHP
PHP实现简易图形计算器
Aug 28 PHP
浅谈如何提高PHP代码的质量
May 28 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
德生PL330的评价与改造
2021/03/02 无线电
十个PHP高级应用技巧果断收藏
2015/09/25 PHP
PHP开发中常用的十个代码样例
2016/02/02 PHP
php入门教程之Zend Studio设置与开发实例
2016/09/09 PHP
php使用PDO事务配合表格读取大量数据插入操作实现方法
2017/02/16 PHP
Laravel重定向,a链接跳转,控制器跳转示例
2019/10/22 PHP
dojo随手记 gird组件引用
2011/02/24 Javascript
Jquery获取复选框被选中值的简单方法
2013/07/04 Javascript
JavaScript图片放大技术(放大镜)实现代码分享
2013/11/14 Javascript
js Array操作的最简短最容易理解方法
2013/12/09 Javascript
JQuery $.each遍历JavaScript数组对象实例
2014/09/01 Javascript
javascript中Number对象的toString()方法分析
2014/12/20 Javascript
javascript中Math.random()使用详解
2015/04/15 Javascript
深入浅析react native es6语法
2015/12/09 Javascript
jQuery基于ajax方式实现用户名存在性检查功能示例
2017/02/10 Javascript
基于JavaScript实现的快速排序算法分析
2017/04/14 Javascript
利用JS做网页特效_大图轮播(实例讲解)
2017/08/09 Javascript
五句话帮你轻松搞定js原型链
2020/12/09 Javascript
Python中针对函数处理的特殊方法
2014/03/06 Python
Python使用正则匹配实现抓图代码分享
2015/04/02 Python
python 以16进制打印输出的方法
2018/07/09 Python
Sanic框架请求与响应实例分析
2018/07/16 Python
tesserocr与pytesseract模块的使用方法解析
2019/08/30 Python
python3 tkinter实现添加图片和文本
2019/11/26 Python
Python 使用 environs 库定义环境变量的方法
2020/02/25 Python
英国的领先快速时尚零售商:In The Style
2019/03/25 全球购物
营销专业应届生求职信
2013/11/26 职场文书
简历中的自我评价怎么写
2014/01/29 职场文书
房产委托公证书样本
2014/04/04 职场文书
我有一个梦想演讲稿
2014/05/05 职场文书
计算机相关专业自荐信
2014/07/02 职场文书
国庆节演讲稿范文2014
2014/09/19 职场文书
作风建设年度心得体会
2014/10/29 职场文书
《改造我们的学习》心得体会
2014/11/07 职场文书
综合实践活动报告
2015/02/05 职场文书
2015年科室工作总结
2015/04/10 职场文书