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的$_FILES的临时储存文件与回收机制实测过程
Jul 12 PHP
PHP源码分析之变量的存储过程分解
Jul 03 PHP
从零开始学YII2框架(五)快速生成代码工具 Gii 的使用
Aug 20 PHP
为PHP5.4开启Zend OPCode缓存
Dec 26 PHP
THINKPHP支持YAML配置文件的设置方法
Mar 17 PHP
深入理解PHP内核(二)之SAPI探究
Nov 10 PHP
PHP Ajax实现无刷新附件上传
Aug 17 PHP
分析php://output和php://stdout的区别
May 06 PHP
为Plesk PHP7启用Oracle OCI8扩展方法总结
Mar 29 PHP
CentOS7编译安装php7.1的教程详解
Apr 18 PHP
Yii框架getter与setter方法功能与用法分析
Oct 22 PHP
PHP操作Redis常用命令的实例详解
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将会员数据导入到ucenter的代码
2010/07/18 PHP
php+ajax注册实时验证功能
2016/07/20 PHP
Laravel5框架添加自定义辅助函数的方法
2018/08/01 PHP
PHP parse_ini_file函数的应用与扩展操作示例
2019/01/07 PHP
javascript下过滤数组重复值的代码
2007/09/10 Javascript
Javascript 检测、添加、移除样式(className)函数代码
2009/09/08 Javascript
javascript 时间比较实现代码
2009/10/28 Javascript
JQuery 将元素显示在屏幕的中央的代码
2010/02/27 Javascript
html5的自定义data-*属性和jquery的data()方法的使用示例
2013/08/21 Javascript
什么是cookie?js手动创建和存储cookie
2014/05/27 Javascript
jQuery定义背景动态切换效果的方法
2015/03/23 Javascript
AngularJS的一些基本样式初窥
2015/07/27 Javascript
js运动应用实例解析
2015/12/28 Javascript
jquery实现具有收缩功能的垂直导航菜单
2016/02/16 Javascript
js创建jsonArray传输至后台及后台全面解析
2016/04/11 Javascript
checkbox 选中一个另一个checkbox也会选中的实现代码
2016/07/09 Javascript
Html5+jQuery+CSS制作相册小记录
2016/12/30 Javascript
jQuery.form.js的使用详解
2017/06/14 jQuery
javascript用rem来做响应式开发
2018/01/13 Javascript
vue实现购物车抛物线小球动画效果的方法详解
2019/02/13 Javascript
微信小程序HTTP接口请求封装代码实例
2019/09/05 Javascript
JS图片预加载三种实现方法解析
2020/05/08 Javascript
Python中正则表达式详解
2017/05/17 Python
详谈Python基础之内置函数和递归
2017/06/21 Python
Python GUI编程学习笔记之tkinter事件绑定操作详解
2020/03/30 Python
Python3.9新特性详解
2020/10/10 Python
canvas之万花筒效果的简单实现(推荐)
2016/08/16 HTML / CSS
英国的知名精品百货公司:House of Fraser(福来德)
2016/08/14 全球购物
伦敦一卡通:The London Pass
2018/11/30 全球购物
领导干部考察材料
2014/02/08 职场文书
三分钟演讲稿范文
2014/04/24 职场文书
2015大学生党员自我评价范文
2015/03/03 职场文书
大学生个人简历自荐信
2015/03/06 职场文书
在校生证明
2015/06/17 职场文书
幼儿教师三分钟演讲稿
2019/06/21 职场文书
MySQL导致索引失效的几种情况
2022/06/25 MySQL