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 相关文章推荐
WML,Apache,和 PHP 的介绍
Oct 09 PHP
色色整理的PHP面试题集锦
Mar 08 PHP
php利用curl抓取新浪微博内容示例
Apr 27 PHP
百度工程师讲PHP函数的实现原理及性能分析(二)
May 13 PHP
FastCGI 进程意外退出造成500错误
Jul 26 PHP
微信公众平台开发之天气预报功能
Aug 31 PHP
php抛出异常与捕捉特定类型的异常详解
Oct 26 PHP
Laravel中日期时间处理包Carbon的简单使用
Sep 21 PHP
docker-compose部署php项目实例详解
Jul 30 PHP
thinkphp3.2框架中where条件查询用法总结
Aug 13 PHP
PHP面向对象程序设计中的self、static、parent关键字用法分析
Aug 14 PHP
Laravel 已登陆用户再次查看登陆页面的自动跳转设置方法
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
用PHP连接Oracle for NT 远程数据库
2006/10/09 PHP
php小型企业库存管理系统的设计与实现代码
2011/05/16 PHP
PHP中其实也可以用方法链
2011/11/10 PHP
JavaScript 定义function的三种方式小结
2009/10/16 Javascript
用jquery实现学校的校历(asp.net+jquery ui 1.72)
2010/01/01 Javascript
JsDom 编程小结
2011/08/09 Javascript
javascript获取所有同类checkbox选项(实例代码)
2013/11/07 Javascript
js实现获取焦点后光标在字符串后
2014/09/17 Javascript
html的DOM中Event对象onabort事件用法实例
2015/01/21 Javascript
JS实现CheckBox复选框全选全不选功能
2015/05/06 Javascript
javascript匀速运动实现方法分析
2016/01/08 Javascript
Node.js静态文件服务器改进版
2016/01/10 Javascript
超赞的jQuery图片滑块动画特效代码汇总
2016/01/25 Javascript
简介AngularJS中$http服务的用法
2016/02/06 Javascript
使用vue.js制作分页组件
2016/06/27 Javascript
简单实现js悬浮导航效果
2017/02/05 Javascript
Vue.js实战之通过监听滚动事件实现动态锚点
2017/04/04 Javascript
jquery与js实现全选功能的区别
2017/06/11 jQuery
通过命令行创建vue项目的方法
2017/07/20 Javascript
关于vue中 $emit的用法详解
2018/04/12 Javascript
AngularJS发送异步Get/Post请求方法
2018/08/13 Javascript
JavaScript Dom 绑定事件操作实例详解
2019/10/02 Javascript
Vue实现图片轮播组件思路及实例解析
2020/05/11 Javascript
JavaScript实现H5接金币功能(实例代码)
2021/02/22 Javascript
简单易懂的python环境安装教程
2017/07/13 Python
在Python中使用filter去除列表中值为假及空字符串的例子
2019/11/18 Python
Python中logger日志模块详解
2020/08/04 Python
python进行OpenCV实战之画图(直线、矩形、圆形)
2020/08/27 Python
一款基于css3的列表toggle特效实例教程
2015/01/04 HTML / CSS
应届大学生求职的自我评价
2013/11/17 职场文书
毕业生欢送会主持词
2014/03/31 职场文书
个人担保书格式范文
2014/05/12 职场文书
2014公安机关纪律作风整顿思想汇报
2014/09/13 职场文书
2015年行政人事工作总结
2015/05/21 职场文书
SpringBoot整合MongoDB的实现步骤
2021/06/23 MongoDB
mysql主从复制的实现步骤
2021/10/24 MySQL