tinkphp5.0 traits 的引入

Traits引入

ThinkPHP 5.0开始采用trait功能(PHP5.4+)来作为一种扩展机制,可以方便的实现一个类库的多继承问题。

trait是一种为类似 PHP 的单继承语言而准备的代码复用机制。trait为了减少单继承语言的限制,使开发人员能够自由地在不同层次结构内独立的类中复用方法集。trait和类组合的语义是定义了一种方式来减少复杂性,避免传统多继承和混入类(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操作符可以将其中一个冲突的方法以另一个名称来引入。

更多的关于trait内容可以参考PHP官方手册

时间: 2024-08-08 17:42:03

tinkphp5.0 traits 的引入的相关文章

Yii2.0 是如何引入js和css

今天上午没事,重拾知识,此处是关于yii2.0是如何引入js 和css 使用总结 学习连接1:http://www.yiiframework.com/doc-2.0/guide-output-client-scripts.html 学习连接2:http://www.manks.top/article/yii2_load_js_css_in_end 学习连接3:http://www.yii-china.com/post/detail/39.html 问题:在开发web框架中,使用Yii2.0框架,

vue2.0+按需引入element-ui报错

项目使用vue脚手架自动生成的,vue版本为^2.5.16.项目中需要按需使用element-ui,根据element-ui的官方文档,一开始在babel.config.js文件中修改配置 module.exports = { presets: [ "@vue/app", ["es2015", { "modules": false }] ], "plugins": [["component", [ { &q

hadoop2.6.0实践:引入开发依赖的jar包

hadoop-2.5.0\share\hadoop\common  所有jar,hadoop-2.5.0\share\hadoop\common\lib  所有jar, hadoop-2.5.0\share\hadoop\hdfs  所有jar hadoop-2.5.0\share\hadoop\mapreduce  所有jar hadoop-2.5.0\share\hadoop\yarn  所有jar

iometer 1.1.0 重要特性说明之O_DIRECT flag重新引入(OutStanding设置失效问题)

Iometer 2006.07.27版本在linux系统上一直存在个问题:Iometer的I/O OutStanding 的数值设置没有效果,无法做到异步测试,比如:设置为32的数值,性能测试结果与设置为1相差无几. Iometer 1.1.0 版本已经修复这个存在8年多的严重BUG(xca1019 2012年合入devel分支),但也不能直接说彻底解决了.这个问题最早由Liang YANG提出,并在2006年底得到当时iometer 的维护人MING ZHANG的确认.因为在方案解决上存在分歧

Atitit. C#.net clr 2.0  4.0新特性

Atitit. C#.net clr 2.0  4.0新特性 1. CLR内部结构1 2. CLR 版本发展史3 3. CLR 2.0 3 4. CLR 4 新特性 概览4 4.1.1.  托管与本地代码的互操作5 4.1.2.    垃圾回收6 4.1.3.    代码约定6 4.1.4.    Corrupted state exception6 4.1.5.     新的安全模型7 4.1.6.     同一个进程,多个CLR7 4.1.7.     基本类库7 5. CLR最新发展8 6

SWFUpload 2.5.0版 官方说明文档 中文翻译版

原文地址:http://www.cnblogs.com/youring2/archive/2012/07/13/2590010.html#setFileUploadLimit SWFUpload v2.5.0 Documentation Table of Contents 内容列表 详情请点击翻译:yukon12345 2010.6.10 SWFUpload SWFUpload 版本 2 概览 (Overview) 入门( Getting Started) js对象 (SWFUpload Jav

关于增广算法中反向边引入的理解

首先上一张常见的图: 考虑不引入反向边的情形: 如果执行bfs一次扫描到增广路1-2-4-6,流量总量累加10,得到的残量网络无法继续进行增广,那么算法返回最大流为10. 然而实际上最大流是20,显然该算法是有问题的. 最大流算法都是基于最大流最小割定理的,即网络流中任意可行流必然不超过任意S-T割容量,并且若流f等于某S-T割容量, 该流为最大流,该割为最小割. 这里S-T割容量指sigma(capbility(u, v)),u ∈ S,v ∈ T. 严谨的叙述及证明参考wiki. 而上述算法

Swift2.0新特性

随着刚刚结束的 WWDC 2015 苹果发布了一系列更新,这其中就包括了令人振奋的 Swift 2.0. 这是对之前语言特性的一次大幅的更新,加入了很多实用和方便的元素,下面我们就一起来看看这次更新都包括了什么. 将 println 函数统一为 print 现在我们在代码中输入 println("xxx") 这样的调用时,编译器就会报错: 都已经变成通用的 print 方式了: print("xxx") 语言的结构性更强 比如在 Swift 1.2 中,我们要判断某

BPMN2.0

什么是BPMN.Workflow? BPM(Business Process Management)——“通过建模.自动化.管理和优化流程,打破跨部门跨系统业务过程依赖,提高业务效率和效果”. Workflow——“全部或者部分由计算机支持或自动处理的业务过程”(工作流管理联盟WfMC组织对工作流概念的经典定义) BPM基本内容是管理既定工作的流程,通过服务编排,统一调控各个业务流程,以确保工作在正确的时间被正确的人执行,达到优化整体业务过程的目的.BPM概念的贯彻执行,需要有标准化的流程定义语