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将向Java靠拢
Oct 09 PHP
社区(php&&mysql)二
Oct 09 PHP
PHP源码之explode使用说明
Aug 05 PHP
php实现保存submit内容之后禁止刷新
Mar 19 PHP
php中的四舍五入函数代码(floor函数、ceil函数、round与intval)
Jul 14 PHP
PHP针对JSON操作实例分析
Jan 12 PHP
php curl登陆qq后获取用户信息时证书错误
Feb 03 PHP
PHP实现加密的几种方式介绍
Feb 22 PHP
WordPress的主题编写中获取头部模板和底部模板
Dec 28 PHP
PHP计算日期相差天数实例分析
Feb 23 PHP
又拍云异步上传实例教程详解
Apr 19 PHP
php 自定义错误日志实例详解
Nov 12 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面向对象全攻略 (四)构造方法与析构方法
2009/09/30 PHP
laravel migrate初学常见错误的解决方法
2017/10/11 PHP
PHP自定义函数实现数组比较功能示例
2017/10/19 PHP
PHP fclose函数用法总结
2019/02/15 PHP
php实现断点续传大文件示例代码
2020/06/19 PHP
jQuery 顺便学习下CSS选择器 奇偶匹配nth-child(even)
2010/05/24 Javascript
window.parent与window.openner区别介绍
2012/04/12 Javascript
原生javascript图片自动或手动切换示例附演示源码
2013/09/04 Javascript
JS实现两个大数(整数)相乘
2014/04/28 Javascript
jquery操作select方法汇总
2015/02/05 Javascript
JavaScript中的闭包介绍
2015/03/15 Javascript
javascript类型系统 Array对象学习笔记
2016/01/09 Javascript
javascript仿京东导航左侧分类导航下拉菜单效果
2020/11/25 Javascript
Vue.js 2.0 和 React、Augular等其他前端框架大比拼
2016/10/08 Javascript
jquery的父、子、兄弟节点查找,节点的子节点循环方法
2016/12/07 Javascript
Angular的模块化(代码分享)
2016/12/26 Javascript
jQuery Validate 无法验证 chosen-select元素的解决方法
2017/05/17 jQuery
利用jQuery+localStorage实现一个简易的计时器示例代码
2017/12/25 jQuery
css配合JavaScript实现tab标签切换效果
2018/10/11 Javascript
jQuery实现侧边栏隐藏与显示的方法详解
2018/12/22 jQuery
微信小程序实现上传word、txt、Excel、PPT等文件功能
2019/05/23 Javascript
layui table 表格模板按钮的实例代码
2019/09/21 Javascript
Vue使用axios引起的后台session不同操作
2020/08/14 Javascript
[03:52]DOTA2英雄基础教程 酒仙
2013/12/23 DOTA
[01:10]为家乡而战!完美世界城市挑战赛全国总决赛花絮
2019/07/25 DOTA
python pandas中DataFrame类型数据操作函数的方法
2018/04/08 Python
基于Django URL传参 FORM表单传数据 get post的用法实例
2018/05/28 Python
python实现从本地摄像头和网络摄像头截取图片功能
2019/07/11 Python
使用openCV去除文字中乱入的线条实例
2020/06/02 Python
使用phonegap进行提示操作的具体方法
2017/03/30 HTML / CSS
2014年最新学校运动会广播稿
2014/09/17 职场文书
通知书大全
2015/04/27 职场文书
老干部座谈会主持词
2015/07/03 职场文书
回复函范文
2015/07/14 职场文书
2016年秋季新学期致辞
2015/07/30 职场文书
Python 发送SMTP邮件的简单教程
2021/06/24 Python