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 相关文章推荐
深入mysql_fetch_row()与mysql_fetch_array()的区别详解
Jun 05 PHP
浅析php中jsonp的跨域实例
Jun 21 PHP
PHP中的use关键字概述
Jul 23 PHP
php中随机函数mt_rand()与rand()性能对比分析
Dec 01 PHP
php简单实现MVC
Feb 05 PHP
PHP实现Javascript中的escape及unescape函数代码分享
Feb 10 PHP
php与Mysql的一些简单的操作
Feb 26 PHP
Zend Framework教程之Application用法实例详解
Mar 14 PHP
PHP实现针对日期,月数,天数,周数,小时,分,秒等的加减运算示例【基于strtotime】
Apr 19 PHP
PHP实现将几张照片拼接到一起的合成图片功能【便于整体打印输出】
Nov 14 PHP
PhpStorm配置Xdebug调试的方法步骤
Feb 02 PHP
laravel 使用auth编写登录的方法
Sep 30 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
NOD32 v2.70.32 简体中文封装版 提供下载了
2007/02/27 PHP
php多重接口的实现方法
2015/06/20 PHP
php数组函数array_key_exists()小结
2015/12/10 PHP
javascript学习笔记(五) Array 数组类型介绍
2012/06/19 Javascript
JQuery中$.ajax()方法参数详解及应用
2013/12/12 Javascript
JS数字抽奖游戏实现方法
2015/05/04 Javascript
基于jQuery实现二级下拉菜单效果
2016/02/01 Javascript
js基于setTimeout与setInterval实现多线程
2016/06/17 Javascript
用jQuery旋转插件jqueryrotate制作转盘抽奖
2017/02/10 Javascript
EasyUI为Numberbox添加blur事件的方法
2017/03/05 Javascript
聊聊JS动画库 Velocity.js的使用
2018/03/13 Javascript
微信小程序实现全局搜索代码高亮的示例
2018/03/30 Javascript
Bootstrap Fileinput 4.4.7文件上传实例详解
2018/07/25 Javascript
15个顶级开源JavaScript框架和库
2018/10/10 Javascript
用python的requests第三方模块抓取王者荣耀所有英雄的皮肤实例
2017/12/14 Python
python使用xpath中遇到:到底是什么?
2018/01/04 Python
python+pillow绘制矩阵盖尔圆简单实例
2018/01/16 Python
Python基于OpenCV库Adaboost实现人脸识别功能详解
2018/08/25 Python
学习python可以干什么
2019/02/26 Python
python 中Arduino串口传输数据到电脑并保存至excel表格
2019/10/14 Python
python3读取csv文件任意行列代码实例
2020/01/13 Python
Python几种常见算法汇总
2020/06/02 Python
python如何更新包
2020/06/11 Python
CSS3自定义滚动条样式 ::webkit-scrollbar的示例代码详解
2020/06/01 HTML / CSS
Old Navy加拿大官网:美式休闲服饰品牌
2017/09/26 全球购物
Converse匡威法国官网:美国著名帆布鞋品牌
2018/12/05 全球购物
QA工程师岗位职责
2013/11/20 职场文书
校园十大歌手策划书
2014/02/01 职场文书
企业党建工作总结2015
2015/05/26 职场文书
2015年助理政工师工作总结
2015/05/26 职场文书
鲁冰花观后感
2015/06/10 职场文书
《狼牙山五壮士》教学反思
2016/02/17 职场文书
MySQL完整性约束的定义与实例教程
2021/05/30 MySQL
Vue+Element UI实现概要小弹窗的全过程
2021/05/30 Vue.js
JAVA SpringMVC实现自定义拦截器
2022/03/16 Python