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模拟HTTP认证
Oct 09 PHP
php面向对象全攻略 (十七) 自动加载类
Sep 30 PHP
PHP 处理图片的类实现代码
Oct 23 PHP
深入理解PHP之require/include顺序 推荐
Jan 02 PHP
php中截取中文字符串的代码小结
Jul 17 PHP
php实现按文件名搜索文件的远程文件查找器
May 10 PHP
PHP生成迅雷、快车、旋风等软件的下载链接代码实例
May 12 PHP
php对文件进行hash运算的方法
Apr 03 PHP
注释PHP和html混合代码的小技巧(分享)
Nov 03 PHP
TP3.2批量上传文件或图片 同名冲突问题的解决方法
Aug 01 PHP
phpQuery采集网页实现代码实例
Apr 02 PHP
php7中停止php-fpm服务的方法详解
May 09 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入门速成(2)
2006/10/09 PHP
PHP_Flame(Version:Progress)的原代码
2006/10/09 PHP
修改了一个很不错的php验证码(支持中文)
2007/02/14 PHP
PHP5.2中date()函数显示时间与北京时间相差8小时的解决办法
2009/05/28 PHP
仿dedecms下拉分页样式修改的thinkphp分页类实例
2014/10/30 PHP
PHP设计模式之命令模式示例详解
2020/12/20 PHP
jQuery+ajax实现顶一下,踩一下效果
2010/07/17 Javascript
jquery ui resizable bug解决方法
2010/10/26 Javascript
jQuery EasyUI API 中文文档 - Menu菜单
2011/10/03 Javascript
JQuery设置获取下拉菜单某个选项的值(比较全)
2014/08/05 Javascript
JS图片延迟加载插件LazyImgv1.0用法分析【附demo源码下载】
2017/09/04 Javascript
JavaScript门面模式详解
2017/10/19 Javascript
Vue 路由切换时页面内容没有重新加载的解决方法
2018/09/01 Javascript
详解vue开发中调用微信jssdk的问题
2019/04/16 Javascript
taro 实现购物车逻辑的实例代码
2020/06/05 Javascript
小程序组件传值和引入sass的方法(使用vant Weapp组件库)
2020/11/24 Javascript
[16:43]Heroes19_剃刀(完美)
2014/10/31 DOTA
Python 类与元类的深度挖掘 II【经验】
2016/05/06 Python
Python语言快速上手学习方法
2018/12/14 Python
对Python3 goto 语句的使用方法详解
2019/02/16 Python
python覆盖写入,追加写入的实例
2019/06/26 Python
Django CBV与FBV原理及实例详解
2019/08/12 Python
python创建子类的方法分析
2019/11/28 Python
python实现数据清洗(缺失值与异常值处理)
2019/12/02 Python
django 文件上传功能的相关实例代码(简单易懂)
2020/01/22 Python
Python控制台实现交互式环境执行
2020/06/09 Python
Python自定义sorted排序实现方法详解
2020/09/18 Python
Mankind西班牙男士护肤品网站:购买皮肤护理、护发和剃须
2017/04/27 全球购物
初三化学教学反思
2014/01/23 职场文书
护士岗前培训自我评鉴
2014/02/28 职场文书
法制宣传月活动方案
2014/05/11 职场文书
辞职信格式模板
2015/02/27 职场文书
大学生暑期实践报告之企业经营管理
2019/08/08 职场文书
Django程序的优化技巧
2021/04/29 Python
Python django中如何使用restful框架
2021/06/23 Python
Django模型层实现多表关系创建和多表操作
2021/07/21 Python