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 相关文章推荐
收集的PHP中与数组相关的函数
Mar 22 PHP
php 格式化数字的时候注意数字的范围
Apr 13 PHP
php提示undefined index的几种解决方法
May 21 PHP
php定时计划任务的实现方法详解
Jun 06 PHP
如何使用PHP批量去除文件UTF8 BOM信息
Aug 05 PHP
PHP开发制作一个简单的活动日程表Calendar
Jun 20 PHP
php根据用户名和手机号查询是否存在手机号码
Feb 16 PHP
PHP实现的简单操作SQLite数据库类与用法示例
Jun 19 PHP
yii2 commands模式以及配置crontab定时任务的方法
Aug 19 PHP
PHP封装mysqli基于面向对象的mysql数据库操作类与用法示例
Feb 25 PHP
laravel 实现登陆后返回登陆前的页面方法
Oct 03 PHP
如何在Laravel之外使用illuminate组件详解
Sep 20 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
通过PHP的内置函数,通过DES算法对数据加密和解密
2012/06/21 PHP
session在php5.3中的变化 session_is_registered() is deprecated in
2013/11/12 PHP
JavaScript脚本性能的优化方法
2007/02/02 Javascript
jquery实现心算练习代码
2010/12/06 Javascript
jquery 动态创建元素的方式介绍及应用
2013/04/21 Javascript
去掉gridPanel表头全选框的小例子
2013/07/18 Javascript
js字符串截取函数substr substring slice使用对比
2013/11/27 Javascript
图片翻转效果具体实现代码
2014/01/09 Javascript
JavaScript针对网页节点的增删改查用法实例
2015/02/02 Javascript
JS实现简易图片轮播效果的方法
2015/03/25 Javascript
js实现文字在按钮上滚动的方法
2015/08/20 Javascript
jQuery实现点击小图片淡入淡出显示大图片特效
2015/09/09 Javascript
微信小程序进行微信支付的步骤昂述
2016/12/01 Javascript
jQuery中弹出iframe内嵌页面元素到父页面并全屏化的实例代码
2016/12/27 Javascript
jQuery Validate 相关参数及常用的自定义验证规则
2017/03/06 Javascript
微信小程序 共用变量值的实现
2017/07/12 Javascript
记录一次开发微信网页分享的步骤
2019/05/07 Javascript
layui使用数据表格实现购物车功能
2019/07/26 Javascript
vue实现用户长时间不操作自动退出登录功能的实现代码
2020/07/23 Javascript
python对视频画框标记后保存的方法
2018/12/07 Python
python快排算法详解
2019/03/04 Python
python GUI库图形界面开发之PyQt5控件QTableWidget详细使用方法与属性
2020/02/25 Python
DHC美国官网:日本通信销售第一的化妆品品牌
2017/11/12 全球购物
碧欧泉法国官网:Biotherm法国
2019/10/23 全球购物
伦敦最受欢迎的蛋糕店:Konditor & Cook
2019/11/01 全球购物
Unix控制后台进程都有哪些进程
2016/09/22 面试题
长辈证婚人证婚词
2014/01/09 职场文书
请假条范文大全
2014/04/10 职场文书
煤矿安全承诺书
2014/05/22 职场文书
党员志愿者活动总结
2014/06/26 职场文书
志愿者爱心公益活动策划方案
2014/09/15 职场文书
单位委托书怎么写
2014/09/21 职场文书
2015初中政教处工作总结
2015/07/21 职场文书
煤矿安全生产管理协议书
2016/03/22 职场文书
单机多实例部署 MySQL8.0.20
2022/05/15 MySQL
Win10服务主机占用内存怎么办?Win10服务主机进程占用大量内存解决方法
2022/09/23 数码科技