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 字段类型说明
Apr 27 PHP
调整PHP的性能
Oct 30 PHP
discuz免激活同步登入代码修改方法(discuz同步登录)
Dec 24 PHP
phpmyadmin打开很慢的解决方法
Apr 21 PHP
基于GD2图形库的PHP生成图片缩略图类代码分享
Feb 08 PHP
php实现兼容2038年后Unix时间戳转换函数
Mar 18 PHP
PHP抓取及分析网页的方法详解
Apr 26 PHP
thinkphp3.x中session方法的用法分析
May 20 PHP
php实现留言板功能
Mar 05 PHP
thinkPHP分页功能实例详解
May 05 PHP
PHP 获取 ping 时间的实现方法
Sep 29 PHP
PHP删除字符串中非字母数字字符方法总结
Jan 20 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计算十二星座的函数代码
2012/08/21 PHP
PHP中把有符号整型转换为无符号整型方法
2015/05/27 PHP
PHP连接MYSQL数据库的3种常用方法
2017/02/27 PHP
Thinkphp实现站点静态化的方法详解
2017/03/21 PHP
js资料prototype 属性
2007/03/13 Javascript
解析js中获得父窗口链接getParent方法以及各种打开窗口的方法
2013/06/19 Javascript
文本框中禁止非数字字符输入比如手机号码、邮编
2013/08/19 Javascript
jquery中ajax处理跨域的三大方式
2016/01/05 Javascript
AngularJS ngModel实现指令与输入直接的数据通信
2016/09/21 Javascript
微信小程序 for 循环详解
2016/10/09 Javascript
浅谈javascript中的数据类型转换
2016/12/27 Javascript
详解在Vue中通过自定义指令获取dom元素
2017/03/04 Javascript
js 获取图像缩放后的实际宽高,位置等信息
2017/03/07 Javascript
详解用webpack把我们的业务模块分开打包的方法
2017/07/20 Javascript
JavaScript实现简单评论功能
2017/08/17 Javascript
jQuery幻灯片插件owlcarousel参数说明中文文档
2018/02/27 jQuery
Vue发布项目实例讲解
2019/07/17 Javascript
Vue.js 实现地址管理页面思路详解(地址添加、编辑、删除和设置默认地址)
2019/12/11 Javascript
[03:40]DOTA2抗疫特别篇《英雄年代》
2020/02/28 DOTA
Python采用raw_input读取输入值的方法
2014/08/18 Python
python通过post提交数据的方法
2015/05/06 Python
实用自动化运维Python脚本分享
2018/06/04 Python
Python全排列操作实例分析
2018/07/24 Python
python爬取基于m3u8协议的ts文件并合并
2019/04/26 Python
python实现微信自动回复及批量添加好友功能
2019/07/03 Python
使用PYTHON解析Wireshark的PCAP文件方法
2019/07/23 Python
Python内置加密模块用法解析
2019/11/25 Python
Django Auth用户认证组件实现代码
2020/10/13 Python
H5调用相机拍照并压缩图片的实例代码
2017/07/20 HTML / CSS
怎么写好自荐信
2013/10/30 职场文书
工程管理造价应届生求职信
2013/11/13 职场文书
早餐连锁店计划书
2014/01/08 职场文书
中国梦的演讲稿
2014/01/08 职场文书
我爱幼儿园演讲稿
2014/09/11 职场文书
行为习惯主题班会
2015/08/14 职场文书
利用Python实现模拟登录知乎
2022/05/25 Python