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 相关文章推荐
eWebEditor v3.8 商业完整版 (PHP)
Dec 06 PHP
php 文件状态缓存带来的问题
Dec 14 PHP
收藏的PHP常用函数 推荐收藏保存
Feb 21 PHP
php使用imagick模块实现图片缩放、裁剪、压缩示例
Apr 17 PHP
解析PHP强制转换类型及远程管理插件的安全隐患
Jun 30 PHP
PHP基于单例模式实现的数据库操作基类
Jan 15 PHP
PHP简单数据库操作类实例【支持增删改查及链式操作】
Oct 10 PHP
ThinkPHP实现静态缓存和动态缓存示例代码
May 02 PHP
PHP基于socket实现的简单客户端和服务端通讯功能示例
Jul 10 PHP
tp5修改(实现即点即改)
Oct 18 PHP
基于PHP的登录和注册的功能的实现
Aug 06 PHP
PHPstorm激活码2020年5月13日亲测有效
Sep 17 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在页面中调用fckeditor编辑器的方法
2011/06/10 PHP
PHP 利用Mail_MimeDecode类提取邮件信息示例
2014/01/26 PHP
Windows下的PHP安装pear教程
2014/10/24 PHP
php中instanceof 与 is_a()区别分析
2015/03/03 PHP
详解php用static方法的原因
2018/09/12 PHP
PHP filesize函数用法浅析
2019/02/15 PHP
laravel实现图片上传预览,及编辑时可更换图片,并实时变化的例子
2019/11/14 PHP
使用jQuery实现验证上传图片的格式与大小
2014/12/03 Javascript
Jquery数字上下滚动动态切换插件
2015/08/08 Javascript
基于Arcgis for javascript实现百度地图ABCD marker的效果
2015/09/12 Javascript
jQuery实用技巧必备(下)
2015/11/03 Javascript
jQuery 实现评论等级好评差评特效
2016/05/06 Javascript
Js自定义多选框效果的实例代码
2017/07/05 Javascript
Vue2.0实现将页面中表格数据导出excel的实例
2017/08/09 Javascript
JavaScript实现的原生态Tab标签页功能【兼容IE6】
2017/09/18 Javascript
jQuery实现简单的下拉菜单导航功能示例
2017/12/07 jQuery
axios进阶实践之利用最优雅的方式写ajax请求
2017/12/20 Javascript
详解使用vue-admin-template的优化历程
2018/05/20 Javascript
JS对象与json字符串相互转换实现方法示例
2018/06/14 Javascript
使用JavaScript保存文本文件到本地的两种方法
2019/01/22 Javascript
js实现带有动画的返回顶部
2020/08/09 Javascript
如何使用JS console.log()技巧提高工作效率
2020/10/14 Javascript
Python 中pandas.read_excel详细介绍
2017/06/23 Python
python如何实现反向迭代
2018/03/20 Python
Pyqt5实现英文学习词典
2019/06/24 Python
TensorFlow tf.nn.conv2d_transpose是怎样实现反卷积的
2020/04/20 Python
Python脚本打包成可执行文件过程解析
2020/10/20 Python
爱淘宝:淘宝网购物分享平台
2017/04/28 全球购物
Joseph官网:英国小众奢侈品牌
2019/05/17 全球购物
社会实践感言
2014/01/25 职场文书
自动化毕业生专业自荐书范文
2014/02/04 职场文书
健康教育评估方案
2014/05/25 职场文书
专科应届毕业生求职信
2014/06/04 职场文书
七夕相亲活动策划方案
2014/08/31 职场文书
大班下学期个人总结
2015/02/13 职场文书
redis实现排行榜功能
2021/05/24 Redis