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 开发环境配置(测试开发环境)
Apr 28 PHP
通过PHP修改Linux或Unix口令的方法分享
Jan 30 PHP
解析关于wamp启动是80端口被占用的问题
Jun 21 PHP
php无限遍历文件夹示例分享
Mar 04 PHP
php的mssql数据库连接类实例
Nov 28 PHP
5款适合PHP使用的HTML编辑器推荐
Jul 03 PHP
PHP响应post请求上传文件的方法
Dec 17 PHP
CI框架的安全性分析
May 18 PHP
php实现图片上传时添加文字和图片水印技巧
Apr 18 PHP
PHP + plupload.js实现多图上传并显示进度条加删除实例代码
Mar 06 PHP
php中通过eval实现字符串格式的计算公式
Mar 18 PHP
php实现数组中出现次数超过一半的数字的统计方法
Oct 14 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
域名查询代码公布
2006/10/09 PHP
php Smarty初体验二 获取配置信息
2011/08/08 PHP
PHP strip_tags()去除HTML、XML以及PHP的标签介绍
2014/02/18 PHP
PHP下载远程图片并保存到本地方法总结
2016/01/22 PHP
PHP查询大量数据内存耗尽问题的解决方法
2016/10/28 PHP
PHP ADODB实现分页功能简单示例
2018/05/25 PHP
ie下动态加态js文件的方法
2011/09/13 Javascript
{}与function(){}选用空对象{}来存放keyValue
2012/05/23 Javascript
用JavaScript实现类似于ListBox功能示例代码
2014/03/09 Javascript
JavaScript添加随滚动条滚动窗体的方法
2016/02/23 Javascript
浅谈js-FCC算法Friendly Date Ranges(详解)
2017/04/10 Javascript
JS简单实现父子窗口传值功能示例【未使用iframe框架】
2017/09/20 Javascript
vue定义全局变量和全局方法的方法示例
2018/08/01 Javascript
vue下使用nginx刷新页面404的问题解决
2019/08/02 Javascript
layer扩展打开/关闭动画的方法
2019/09/23 Javascript
jQuery插件实现图片轮播效果
2020/10/19 jQuery
Python实现的金山快盘的签到程序
2013/01/17 Python
使用Python的Tornado框架实现一个Web端图书展示页面
2016/07/11 Python
Python使用zip合并相邻列表项的方法示例
2018/03/17 Python
解决python打不开文件(文件不存在)的问题
2019/02/18 Python
Python的历史与优缺点整理
2020/05/26 Python
Python 如何定义匿名或内联函数
2020/08/01 Python
实例讲解CSS3中的box-flex弹性盒属性布局
2016/06/09 HTML / CSS
Lookfantastic德国官网:英国知名美妆购物网站
2017/06/11 全球购物
英国广泛的照明产品网站:Lights4living
2018/01/28 全球购物
英国电子产品购物网站:Tech in the basket
2019/11/08 全球购物
写一个函数,要求输入一个字符串和一个字符长度,对该字符串进行分隔
2015/07/30 面试题
感恩节红领巾广播稿
2014/02/11 职场文书
优秀教师工作感言
2014/02/16 职场文书
银行求职信范文
2014/05/26 职场文书
2014年国庆节寄语
2014/09/19 职场文书
机关作风建设心得体会
2014/10/22 职场文书
师范生见习报告
2014/10/31 职场文书
大学生个人总结范文
2015/02/15 职场文书
2015社区爱国卫生工作总结
2015/04/21 职场文书
本科毕业论文答辩稿
2015/06/23 职场文书