PHP中的Trait 特性及作用


Posted in PHP onApril 03, 2016

自 PHP 5.4.0 起,PHP 实现了代码复用的一个方法,称为 traits。

Traits 是一种为类似 PHP 的单继承语言而准备的代码复用机制。Trait 为了减少单继承语言的限制,使开发人员能够自由地在不同层次结构内独立的类中复用方法集。Traits 和类组合的语义是定义了一种方式来减少复杂性,避免传统多继承和混入类(Mixin)相关的典型问题。

Trait 和一个类相似,但仅仅旨在用细粒度和一致的方式来组合功能。Trait 不能通过它自身来实例化。它为传统继承增加了水平特性的组合;也就是说,应用类的成员不需要继承。

Trait是在PHP5.4中加入的,它既不是接口也不是类。主要是为了解决单继承语言的限制。是PHP多重继承的一种解决方案。例如,需要同时继承两个 Abstract Class, 这将会是件很麻烦的事情,Trait 就是为了解决这个问题。它能被加入到一个或多个已经存在的类中。它声明了类能做什么(表明了其接口特性),同时也包含了具体实现(表明了其类特性)

简单使用

首先,当然是声明个 Trait,PHP5.4 增加了 trait 关键字

trait first_trait {
function first_method() { /* Code Here */ }
function second_method() { /* Code Here */ }
}

同时,如果要在 Class 中使用该 Trait,那么使用 use 关键字

class first_class {
// 注意这行,声明使用 first_trait
use first_trait;
}
$obj = new first_class();
// Executing the method from trait
$obj->first_method(); // valid
$obj->second_method(); // valid

使用多个 Trait

在同个 Class 中可以使用多个 Trait

trait first_trait
{
function first_method() { echo "method"; }
}
trait second_trait {
function second_method() { echo "method"; }
}
class first_class {
// now using more than one trait
use first_trait, second_trait;
}
$obj= new first_class();
// Valid
$obj->first_method(); // Print : method
// Valid
$obj->second_method(); // Print : method

Trait 之间的嵌套

同时,Trait 之间也可以相互的嵌套,例如

trait first_trait {
function first_method() { echo "method"; }
}
trait second_trait {
use first_trait;
function second_method() { echo "method"; }
}
class first_class {
// now using 
use second_trait;
}
$obj= new first_class();
// Valid
$obj->first_method(); // Print : method
// Valid
$obj->second_method(); // Print : method

Trait 的抽象方法(Abstract Method)

我们可以在 Trait 中声明需要实现的抽象方法,这样能使使用它的 Class 必须实现它

trait first_trait {
function first_method() { echo "method"; }
// 这里可以加入修饰符,说明调用类必须实现它
abstract public function second_method();
}
class first_method {
use first_trait;
function second_method() {
/* Code Here */
}
}

Trait 冲突

多个 Trait 之间同时使用难免会冲突,这需要我们去解决。PHP5.4 从语法方面带入了相关 的关键字语法:insteadof 以及 as ,用法参见

trait first_trait {
function first_function() { 
echo "From First Trait";
}
}
trait second_trait {
// 这里的名称和 first_trait 一样,会有冲突
function first_function() { 
echo "From Second Trait";
}
}
class first_class {
use first_trait, second_trait {
// 在这里声明使用 first_trait 的 first_function 替换
// second_trait 中声明的
first_trait::first_function insteadof second_trait;
}
} 
$obj = new first_class();
// Output: From First Trait
$obj->first_function();

上面就是些 Trait 比较基本的使用了,更详细的可以参考官方手册。这里总结下注意的几 点:

Trait 会覆盖调用类继承的父类方法

Trait 无法如 Class 一样使用 new 实例化

单个 Trait 可由多个 Trait 组成

在单个 Class 中,可以使用多个 Trait

Trait 支持修饰词(modifiers),例如 final、static、abstract

我们能使用 insteadof 以及 as 操作符解决 Trait 之间的冲突

PHP 相关文章推荐
使用sockets:从新闻组中获取文章(二)
Oct 09 PHP
php 显示指定路径下的图片
Oct 29 PHP
全新的PDO数据库操作类php版(仅适用Mysql)
Jul 22 PHP
php var_export与var_dump 输出的不同
Aug 09 PHP
PHP 如何利用phpexcel导入数据库
Aug 24 PHP
Thinkphp模板中截取字符串函数简介
Jun 17 PHP
PHP扩展开发入门教程
Feb 26 PHP
使用php转义输出HTML到JavaScript
Mar 27 PHP
php 二维数组时间排序实现代码
Nov 19 PHP
PHP实现的字符串匹配算法示例【sunday算法】
Dec 19 PHP
PHP ADODB生成下拉列表框功能示例
May 29 PHP
YII2框架中添加自定义模块的方法实例分析
Mar 18 PHP
PHP错误处理函数
Apr 03 #PHP
php通过curl添加cookie伪造登陆抓取数据的方法
Apr 02 #PHP
PHP函数nl2br()与自定义函数nl2p()换行用法分析
Apr 02 #PHP
PHP使用stream_context_create()模拟POST/GET请求的方法
Apr 02 #PHP
PHP函数shuffle()取数组若干个随机元素的方法分析
Apr 02 #PHP
PHP函数import_request_variables()用法分析
Apr 02 #PHP
PHP数组函数array_multisort()用法实例分析
Apr 02 #PHP
You might like
改德生G88 - 加装等响度低音提升电路
2021/03/02 无线电
PHP下通过系统信号量加锁方式获取递增序列ID
2009/09/25 PHP
php 上传文件类型判断函数(避免上传漏洞 )
2010/06/08 PHP
PHP 处理TXT文件(打开/关闭/检查/读取)
2013/05/13 PHP
百度ping方法使用示例 自动ping百度
2014/01/26 PHP
php常用表单验证类用法实例
2015/06/18 PHP
PHP实现的mysql操作类【MySQL与MySQLi方式】
2017/10/07 PHP
JQUERY操作JSON实例代码
2010/02/09 Javascript
Microsoft Ajax Minifier 压缩javascript的方法
2010/03/05 Javascript
JS函数验证总结(方便js客户端输入验证)
2010/10/29 Javascript
window.location的重写及判断location是否被重写
2014/09/04 Javascript
JQuery异步获取返回值中文乱码的解决方法
2015/01/29 Javascript
js实现数字每三位加逗号的方法
2015/02/05 Javascript
jQuery基于ajax()使用serialize()提交form数据的方法
2015/12/08 Javascript
Javascript 高性能之递归,迭代,查表法详解及实例
2017/01/08 Javascript
jquery图片放大镜效果
2017/06/23 jQuery
JavaScript无操作后屏保功能的实现方法
2017/07/04 Javascript
ajax请求+vue.js渲染+页面加载的示例
2018/02/11 Javascript
Vue.js项目中管理每个页面的头部标签的两种方法
2018/06/25 Javascript
react 父子组件之间通讯props
2018/09/08 Javascript
解决Vue动态加载本地图片问题
2019/10/09 Javascript
《javascript设计模式》学习笔记四:Javascript面向对象程序设计链式调用实例分析
2020/04/07 Javascript
[52:07]完美世界DOTA2联赛PWL S3 LBZS vs access 第二场 12.10
2020/12/13 DOTA
Python循环语句之break与continue的用法
2015/10/14 Python
Python开发SQLite3数据库相关操作详解【连接,查询,插入,更新,删除,关闭等】
2017/07/27 Python
Python字典的基本用法实例分析【创建、增加、获取、修改、删除】
2019/03/05 Python
英国和爱尔兰最大的地毯零售商:Kukoon
2018/12/17 全球购物
SIMON MILLER官网:洛杉矶的生活方式品牌
2020/10/19 全球购物
高分子材料与工程专业个人求职信
2013/12/15 职场文书
委托证明的格式
2014/01/10 职场文书
反对形式主义、官僚主义、享乐主义和奢靡之风整改措施
2014/09/17 职场文书
2014年综合治理工作总结
2014/11/20 职场文书
中学生社区服务活动报告
2015/02/05 职场文书
2015年度党员自我评价范文
2015/03/03 职场文书
原生CSS实现文字无限轮播的通用方法
2021/03/30 HTML / CSS
MySQL 原理与优化之Limit 查询优化
2022/08/14 MySQL