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安装全攻略:APACHE
Oct 09 PHP
php 字符过滤类,用于过滤各类用户输入的数据
May 27 PHP
php动态实现表格跨行跨列实现代码
Nov 06 PHP
codeigniter使用技巧批量插入数据实例方法分享
Dec 31 PHP
php object转数组示例
Jan 15 PHP
ThinkPHP打开验证码页面显示乱码的解决方法
Dec 18 PHP
php实现微信企业付款到个人零钱功能
Oct 09 PHP
Laravel框架实现的rbac权限管理操作示例
Jan 16 PHP
php链式操作的实现方式分析
Aug 12 PHP
Laravel 前端资源配置教程
Oct 18 PHP
php实现微信和支付宝支付的示例代码
Aug 11 PHP
PHP实现创建以太坊钱包转账等功能
Apr 21 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数据库连接
2006/10/09 PHP
PHP入门速成教程
2007/03/19 PHP
php 连接mssql数据库 初学php笔记
2010/03/01 PHP
php正则过滤html标签、空格、换行符的代码(附说明)
2010/10/25 PHP
php实现多维数组中每个单元值(数字)翻倍的方法
2015/02/16 PHP
轻松实现javascript图片轮播特效
2016/01/13 Javascript
js中字符串编码函数escape()、encodeURI()、encodeURIComponent()区别详解
2016/04/01 Javascript
最简单纯JavaScript实现Tab标签页切换的方式(推荐)
2016/07/25 Javascript
微信小程序中的onLoad详解及简单实例
2017/04/05 Javascript
DataTables添加额外的查询参数和删除columns等无用参数实例
2017/07/04 Javascript
JavaScript判断日期时间差的实例代码
2018/03/01 Javascript
vue+axios新手实践实现登陆的示例代码
2018/06/06 Javascript
javascript中的event loop事件循环详解
2018/12/14 Javascript
ElementUI Tag组件实现多标签生成的方法示例
2019/07/08 Javascript
深入了解Hybrid App技术的相关知识
2019/07/17 Javascript
JS判断数组是否包含某元素实现方法汇总
2020/06/24 Javascript
vue 扩展现有组件的操作
2020/08/14 Javascript
vue.js 输入框输入值自动过滤特殊字符替换中问标点操作
2020/08/31 Javascript
Python的时间模块datetime详解
2017/04/17 Python
django中模板的html自动转意方法
2018/05/27 Python
使用python判断jpeg图片的完整性实例
2019/06/10 Python
python自动化工具之pywinauto实例详解
2019/08/26 Python
python3 BeautifulSoup模块使用字典的方法抓取a标签内的数据示例
2019/11/28 Python
pytorch中获取模型input/output shape实例
2019/12/30 Python
在Python3.74+PyCharm2020.1 x64中安装使用Kivy的详细教程
2020/08/07 Python
CSS3 毛玻璃效果
2019/08/14 HTML / CSS
CSS3+JavaScript实现炫酷呼吸效果的示例代码
2020/06/15 HTML / CSS
美国顶级奢侈茶:Mighty Leaf Tea(美泰茶)
2016/11/26 全球购物
英国领先的葡萄酒专家:Majestic Wine
2017/05/30 全球购物
交警个人先进事迹材料
2014/05/11 职场文书
企业职业病防治方案
2014/05/29 职场文书
社区党员公开承诺书
2014/08/30 职场文书
后备干部推荐材料
2014/12/24 职场文书
《7的乘法口诀》教学反思
2016/02/18 职场文书
python使用tkinter实现透明窗体上绘制随机出现的小球(实例代码)
2021/05/17 Python
Redis 的查询很快的原因解析及Redis 如何保证查询的高效
2022/03/16 Redis