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 购物车的例子
May 04 PHP
将文件夹压缩成zip文件的php代码
Dec 14 PHP
PHP $_FILES函数详解
Mar 09 PHP
PHP的SQL注入过程分析
Jan 06 PHP
PHP中使用数组实现堆栈数据结构的代码
Feb 05 PHP
简单介绍win7下搭建apache+php+mysql开发环境
Aug 06 PHP
php判断邮箱地址是否存在的方法
Feb 13 PHP
PHP实现的DES加密解密实例代码
Apr 06 PHP
Thinkphp整合微信支付功能
Dec 14 PHP
Yii CDBCriteria常用方法实例小结
Jan 19 PHP
php编程实现简单的网页版计算器功能示例
Apr 26 PHP
微信JSSDK分享功能图文实例详解
Apr 08 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
关于尾递归的使用详解
2013/05/02 PHP
Laravel中log无法写入问题的解决
2017/06/17 PHP
JavaScript 设计模式学习 Factory
2009/07/29 Javascript
js限制文本框为整数和货币的函数代码
2010/10/13 Javascript
6款新颖的jQuery和CSS3进度条插件推荐
2013/03/05 Javascript
jquery索引在使用中的一些困惑
2013/10/24 Javascript
js实现对table动态添加、删除和更新的方法
2015/02/10 Javascript
node.js回调函数之阻塞调用与非阻塞调用
2015/11/13 Javascript
移动端H5开发 Turn.js实现很棒的翻书效果
2016/06/20 Javascript
微信公众平台开发教程(五)详解自定义菜单
2016/12/02 Javascript
Jquery给当前页或者跳转后页面的导航栏添加选中后样式的实例
2016/12/08 Javascript
vue中使用refs定位dom出现undefined的解决方法
2017/12/21 Javascript
javaScript强制保留两位小数的输入数校验和小数保留问题
2018/05/09 Javascript
基于AngularJs select绑定数字类型的问题
2018/10/08 Javascript
使用python将mdb数据库文件导入postgresql数据库示例
2014/02/17 Python
tornado 多进程模式解析
2018/01/15 Python
python实现植物大战僵尸游戏实例代码
2019/06/10 Python
Python实现的ftp服务器功能详解【附源码下载】
2019/06/26 Python
python开发之anaconda以及win7下安装gensim的方法
2019/07/05 Python
如何使用Python自动控制windows桌面
2019/07/11 Python
wxPython实现整点报时
2019/11/18 Python
对tensorflow 中tile函数的使用详解
2020/02/07 Python
HTML5新特性 多线程(Worker SharedWorker)
2017/04/24 HTML / CSS
营销总经理岗位职责
2014/02/02 职场文书
电厂职工自我鉴定
2014/02/20 职场文书
网上祭先烈心得体会
2014/09/01 职场文书
师德师风建设整改措施思想汇报
2014/10/11 职场文书
学习焦裕禄精神践行三严三实心得体会
2014/10/13 职场文书
四风问题原因分析及整改措施
2014/10/24 职场文书
2015年党日活动总结范文
2015/03/25 职场文书
公司出纳岗位职责
2015/03/31 职场文书
数据库的高级查询六:表连接查询:外连接(左外连接,右外连接,UNION关键字,连接中ON与WHERE的不同)
2021/04/05 MySQL
CSS3实现三角形不断放大效果
2021/04/13 HTML / CSS
Mysql数据库值的添加、修改、删除及清空操作实例
2021/06/20 MySQL
Redis keys命令的具体使用
2022/06/05 Redis
Nginx如何获取自定义请求header头和URL参数详解
2022/07/23 Servers