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 相关文章推荐
桌面中心(四)数据显示
Oct 09 PHP
php Smarty模板生成html文档的方法
Apr 12 PHP
php 安全过滤函数代码
May 07 PHP
PHP学习笔记 (1) 环境配置与代码调试
Jun 19 PHP
PHP二维数组排序的3种方法和自定义函数分享
Apr 09 PHP
PHP中的traits简单使用实例
May 13 PHP
理解php依赖注入和控制反转
May 11 PHP
Yii2.0 模态弹出框+ajax提交表单
May 22 PHP
php PDO实现的事务回滚示例
Mar 23 PHP
PHP关键特性之命名空间实例详解
May 06 PHP
Laravel框架自定义公共函数的引入操作示例
Apr 16 PHP
thinkphp5实现微信扫码支付
Dec 23 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
php批量删除数据
2007/01/18 PHP
Discuz7.2版的faq.php SQL注入漏洞分析
2014/08/06 PHP
Yii学习总结之数据访问对象 (DAO)
2015/02/22 PHP
php使用Image Magick将PDF文件转换为JPG文件的方法
2015/04/01 PHP
PHP文件管理之实现网盘及压缩包的功能操作
2017/09/20 PHP
PHP实现简单日历类编写
2020/08/28 PHP
些很实用且必用的小脚本代码
2006/06/26 Javascript
记录几个javascript有关的小细节
2007/04/02 Javascript
JavaScript脚本性能优化注意事项
2008/11/18 Javascript
VUEJS实战之构建基础并渲染出列表(1)
2016/06/13 Javascript
js对象浅拷贝和深拷贝详解
2016/09/05 Javascript
微信小程序  Mustache语法详细介绍
2016/10/27 Javascript
浅谈jQuery中的eq()与DOM中element.[]的区别
2016/10/28 Javascript
JS中setTimeout和setInterval的最大延时值详解
2017/02/13 Javascript
jQuery插件HighCharts绘制2D圆环图效果示例【附demo源码下载】
2017/03/09 Javascript
详解Vue中添加过渡效果
2017/03/20 Javascript
Bootstrap警告框(Alert)插件使用方法
2017/03/21 Javascript
浅谈React Native Flexbox布局(小结)
2018/01/08 Javascript
微信小程序textarea层级过高的解决方法
2019/03/04 Javascript
基于vue的video播放器的实现示例
2021/02/19 Vue.js
[13:16]INFAMOUS vs VGJ T BO3
2018/06/07 DOTA
深度剖析使用python抓取网页正文的源码
2014/06/11 Python
Python使用正则匹配实现抓图代码分享
2015/04/02 Python
python select.select模块通信全过程解析
2017/09/20 Python
django定期执行任务(实例讲解)
2017/11/03 Python
用python生成1000个txt文件的方法
2018/10/25 Python
对python多线程与global变量详解
2018/11/09 Python
Python Mock模块原理及使用方法详解
2020/07/07 Python
Python selenium模块实现定位过程解析
2020/07/09 Python
Nisbets爱尔兰:英国最大的厨房和餐饮设备供应商
2019/01/26 全球购物
法律专业学生的自我评价
2014/02/07 职场文书
2014年社区党建工作汇报材料
2014/11/02 职场文书
初中政治教学反思
2016/02/23 职场文书
javaScript Array api梳理
2021/03/31 Javascript
QT连接MYSQL数据库的详细步骤
2021/07/07 MySQL
SpringBoot快速入门详解
2021/07/21 Java/Android