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 相关文章推荐
给多个地址发邮件的类
Oct 09 PHP
Linux下 php5 MySQL5 Apache2 phpMyAdmin ZendOptimizer安装与配置[图文]
Nov 18 PHP
PHP iconv 函数转gb2312的bug解决方法
Oct 11 PHP
php json_encode奇怪问题说明
Sep 27 PHP
php中定时计划任务的实现原理
Jan 08 PHP
php calender(日历)二个版本代码示例(解决2038问题)
Dec 24 PHP
php选择排序法实现数组排序实例分析
Feb 16 PHP
既简单又安全的PHP验证码 附调用方法
Jun 02 PHP
php 访问oracle 存储过程实例详解
Jan 08 PHP
PHP+mysql实现的三级联动菜单功能示例
Feb 15 PHP
PHP的图像处理实例小结【文字水印、图片水印、压缩图像等】
Dec 20 PHP
如何解决php-fpm启动不了问题
Nov 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
Godaddy空间Zend Optimizer升级方法
2010/05/10 PHP
php daddslashes()和 saddslashes()有哪些区别分析
2012/10/26 PHP
php将session放入memcached的设置方法
2014/02/14 PHP
thinkphp中session和cookie无效的解决方法
2014/12/19 PHP
CI框架使用composer安装的依赖包步骤与方法分析
2016/11/21 PHP
PHP中empty,isset,is_null用法和区别
2017/02/19 PHP
ThinkPHP5.0框架结合Swoole开发实现WebSocket在线聊天案例详解
2019/04/02 PHP
PHP实现的微信公众号扫码模拟登录功能示例
2019/05/30 PHP
任意位置显示html菜单
2007/02/01 Javascript
Javascript日期对象的dateAdd与dateDiff方法
2008/11/18 Javascript
js生成的验证码的实现与技术分析
2014/09/17 Javascript
详解JavaScript操作HTML DOM的基本方式
2015/10/21 Javascript
JS实现全屏的四种写法
2016/12/30 Javascript
vue使用stompjs实现mqtt消息推送通知
2017/06/22 Javascript
js排序与重组的实例讲解
2017/08/28 Javascript
JavaScript表单即时验证 验证不成功不能提交
2017/08/31 Javascript
详解基于Node.js的HTTP/2 Server实践
2018/05/31 Javascript
Bootstrap Table 双击、单击行获取该行及全表内容
2018/08/31 Javascript
vue实现条件叠加搜索的解决方法
2019/05/28 Javascript
如何管理Vue中的缓存页面
2021/02/06 Vue.js
Python计算三角函数之asin()方法的使用
2015/05/15 Python
Python中with及contextlib的用法详解
2017/06/08 Python
Python学习pygal绘制线图代码分享
2017/12/09 Python
PyTorch 1.0 正式版已经发布了
2018/12/13 Python
详解Django项目中模板标签及模板的继承与引用(网站中快速布置广告)
2019/03/27 Python
pandas计算最大连续间隔的方法
2019/07/04 Python
Python3 读取Word文件方式
2020/02/13 Python
python json.dumps中文乱码问题解决
2020/04/01 Python
详细分析Python collections工具库
2020/07/16 Python
CSS3 实现弹跳的小球动画
2020/10/26 HTML / CSS
世界上最大的餐具公司:Oneida
2016/12/17 全球购物
全球烹饪课程的领先预订平台:Cookly
2020/01/28 全球购物
大学生物业管理求职信
2013/10/24 职场文书
2014年餐厅服务员工作总结
2014/11/18 职场文书
公司食堂管理制度
2015/08/05 职场文书
七个Python必备的GUI库
2021/04/27 Python