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 相关文章推荐
对javascript和select部件的结合运用
Oct 09 PHP
php 显示指定路径下的图片
Oct 29 PHP
php魔术方法与魔术变量、内置方法与内置变量的深入分析
Jun 03 PHP
测试PHP连接MYSQL成功与否的代码
Aug 16 PHP
PHP获取短链接跳转后的真实地址和响应头信息的方法
Jul 25 PHP
VB中的RasEnumConnections函数返回632错误解决方法
Jul 29 PHP
PHP使用memcache缓存技术提高响应速度的方法
Dec 26 PHP
windows下的WAMP环境搭建图文教程(推荐)
Jul 27 PHP
php中输出json对象的值(实现方法)
Mar 07 PHP
PHP封装的page分页类定义与用法完整示例
Dec 24 PHP
PHP的微信支付接口使用方法讲解
Mar 08 PHP
laravel邮件发送的实现代码示例
Jan 31 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 过滤页面中的BOM(实现代码)
2013/06/29 PHP
php获取用户浏览器版本的方法
2015/01/03 PHP
javascript+php实现根据用户时区显示当地时间的方法
2015/03/11 PHP
php单一接口的实现方法
2015/06/20 PHP
[原创]PHP实现生成vcf vcard文件功能类定义与使用方法详解【附demo源码下载】
2017/09/02 PHP
javascript 对象的定义方法
2007/01/10 Javascript
js调试工具console.log()方法查看js代码的执行情况
2014/08/08 Javascript
如何用JavaScript定义一个类
2014/09/12 Javascript
jQuery鼠标事件汇总
2015/08/30 Javascript
js生成随机数(指定范围)的实例代码
2016/07/10 Javascript
微信小程序 animation API详解及实例代码
2016/10/08 Javascript
Angular的$http的ajax的请求操作(推荐)
2017/01/10 Javascript
微信小程序 scroll-view隐藏滚动条详解
2017/01/16 Javascript
vue实现导航栏效果(选中状态刷新不消失)
2017/12/13 Javascript
webpack打包js文件及部署的实现方法
2017/12/18 Javascript
React 高阶组件入门介绍
2018/01/11 Javascript
JS验证输入的是否是数字及保留几位小数问题
2018/05/09 Javascript
浅析前端路由简介以及vue-router实现原理
2018/06/01 Javascript
详解Vue CLI3配置解析之css.extract
2018/09/14 Javascript
关于vue路由缓存清除在main.js中的设置
2019/11/06 Javascript
使用Python编写简单网络爬虫抓取视频下载资源
2014/11/04 Python
Python在不同目录下导入模块的实现方法
2017/10/27 Python
使用C++扩展Python的功能详解
2018/01/12 Python
Python文本处理之按行处理大文件的方法
2018/04/09 Python
对Python信号处理模块signal详解
2019/01/09 Python
python被修饰的函数消失问题解决(基于wraps函数)
2019/11/04 Python
Pyspark获取并处理RDD数据代码实例
2020/03/27 Python
pytorch读取图像数据转成opencv格式实例
2020/06/02 Python
python图片合成的示例
2020/11/09 Python
网站编辑求职信
2013/10/17 职场文书
入党积极分子思想汇报
2014/01/02 职场文书
房地产开发计划书
2014/01/10 职场文书
关于感恩的演讲稿400字
2014/08/26 职场文书
2014领导班子“四风问题”对照检查材料思想汇报(执法局)
2014/09/21 职场文书
小学优秀教师事迹材料
2014/12/16 职场文书
好人好事新闻稿
2015/07/17 职场文书