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 单引号与双引号的区别
Nov 24 PHP
php中常用字符串处理代码片段整理
Nov 07 PHP
php在文件指定行中写入代码的方法
May 23 PHP
PHP获取网址的顶级域名函数代码
Sep 24 PHP
比较strtr, str_replace和preg_replace三个函数的效率
Jun 26 PHP
codeigniter发送邮件并打印调试信息的方法
Mar 21 PHP
php+ajax实现无刷新的新闻留言系统
Dec 21 PHP
PHP实现简易blog的制作
Oct 24 PHP
Yii2框架制作RESTful风格的API快速入门教程
Nov 08 PHP
php实现自定义中奖项数和概率的抽奖函数示例
May 26 PHP
php实现生成带二维码图片并强制下载功能
Feb 24 PHP
Yii框架使用PHPExcel导出Excel文件的方法分析【改进版】
Jul 24 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
Fatal error: Allowed memory size of 134217728 bytes exhausted (tried to allocate 2611816 bytes)
2014/11/08 PHP
php图片的二进制转换实现方法
2014/12/15 PHP
php自定义扩展名获取函数示例
2016/12/12 PHP
Thinkphp框架 表单自动验证登录注册 ajax自动验证登录注册
2016/12/27 PHP
PHP getName()函数讲解
2019/02/03 PHP
createElement动态创建HTML对象脚本代码
2008/11/24 Javascript
Ajax+Json 级联菜单实现代码
2009/10/27 Javascript
jquery multiSelect 多选下拉框
2010/07/09 Javascript
javascript实现的平方米、亩、公顷单位换算小程序
2014/08/11 Javascript
jQuery+css实现的换页标签栏效果
2016/01/27 Javascript
AngularJS基础 ng-mouseenter 指令示例代码
2016/08/02 Javascript
新手vue构建单页面应用实例代码
2017/09/18 Javascript
spirngmvc js传递复杂json参数到controller的实例
2018/03/29 Javascript
小程序云开发初探(小结)
2018/10/24 Javascript
JS闭包经典实例详解
2018/12/20 Javascript
微信小程序实现收货地址左滑删除
2020/11/18 Javascript
vue项目中使用eslint+prettier规范与检查代码的方法
2020/01/16 Javascript
使用typescript改造koa开发框架的实现
2020/02/04 Javascript
jQuery实现鼠标滑动切换图片
2020/05/27 jQuery
通过实例了解Nodejs模块系统及require机制
2020/07/16 NodeJs
Element InputNumber计数器的使用方法
2020/07/27 Javascript
探究一道价值25k的蚂蚁金服异步串行面试题
2020/08/21 Javascript
Python selenium抓取微博内容的示例代码
2018/05/17 Python
matplotlib调整子图间距,调整整体空白的方法
2018/08/03 Python
Python查找文件中包含中文的行方法
2018/12/19 Python
python实现屏保程序(适用于背单词)
2019/07/30 Python
Python实现图像的垂直投影示例
2020/01/17 Python
PyTorch中torch.tensor与torch.Tensor的区别详解
2020/05/18 Python
keras 指定程序在某块卡上训练实例
2020/06/22 Python
python基于win32api实现键盘输入
2020/12/09 Python
HTML5实现的震撼3D焦点图动画的示例代码
2019/09/26 HTML / CSS
党在我心中演讲稿
2014/09/02 职场文书
优质服务标语口号
2015/12/26 职场文书
《丑小鸭》教学反思
2016/02/19 职场文书
win10蓝屏0xc0000001安全模式进不了怎么办?win10出现0xc0000001的解决方法
2022/08/05 数码科技
TypeScript实用技巧 Nominal Typing名义类型详解
2022/09/23 Javascript