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判断字符以及字符串的包含方法属性
Aug 30 PHP
浅谈php扩展imagick
Jun 02 PHP
PHP5.3以上版本安装ZendOptimizer扩展
Mar 27 PHP
Laravel 5框架学习之环境与配置
Apr 08 PHP
PHP类的声明与实例化及构造方法与析构方法详解
Jan 26 PHP
php遍历替换目录下文件指定内容的方法
Nov 10 PHP
PHP实现Unicode编码相互转换的方法示例
Nov 17 PHP
PHP获取数组中单列值的方法
Jun 10 PHP
php中请求url的五种方法总结
Jul 13 PHP
Laravel网站打开速度优化的方法汇总
Jul 16 PHP
PHP+Ajax实现的检测用户名功能简单示例
Feb 12 PHP
php设计模式之代理模式分析【星际争霸游戏案例】
Mar 23 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 cookie 作用范围?不要在当前页面使用你的cookie
2009/03/24 PHP
跟随鼠标旋转的文字
2006/11/30 Javascript
ie下动态加态js文件的方法
2011/09/13 Javascript
jQuery取得select选择的文本与值的示例
2013/12/09 Javascript
利用JQuery制作符合Web标准的QQ弹出消息
2014/01/14 Javascript
学习JavaScript设计模式之模板方法模式
2016/01/20 Javascript
详解javascript实现瀑布流列式布局
2016/01/29 Javascript
angularjs实现下拉列表的选中事件示例
2017/03/03 Javascript
js遍历获取表格内数据的方法(必看)
2017/04/06 Javascript
轻量级JS Cookie插件js-cookie的使用方法
2018/03/22 Javascript
使用D3.js构建实时图形的示例代码
2018/08/28 Javascript
详解Vue This$Store总结
2018/12/17 Javascript
如何封装了一个vue移动端下拉加载下一页数据的组件
2019/01/06 Javascript
浅谈v-for 和 v-if 并用时筛选条件方法
2019/11/07 Javascript
JavaScript HTML DOM 元素 (节点)新增,编辑,删除操作实例分析
2020/03/02 Javascript
Python学习笔记(一)(基础入门之环境搭建)
2014/06/05 Python
简洁的十分钟Python入门教程
2015/04/03 Python
使用Python OpenCV为CNN增加图像样本的实现
2019/06/10 Python
python交易记录整合交易类详解
2019/07/03 Python
django+tornado实现实时查看远程日志的方法
2019/08/12 Python
CSS3 旋转立方体问题详解
2020/01/09 HTML / CSS
世界上最全面的草药补充剂和顶级品牌维生素网站:HerbsPro
2019/01/20 全球购物
Linux管理员面试题 Linux admin interview questions
2016/07/08 面试题
日期和时间问题
2015/01/04 面试题
个人充满哲理的自我评价
2014/02/20 职场文书
环保公益广告语
2014/03/13 职场文书
学生会竞聘书范文
2014/03/31 职场文书
授权委托书格式模板
2014/04/03 职场文书
学习雷锋演讲稿
2014/05/10 职场文书
小学国旗下的演讲稿
2014/08/28 职场文书
婚礼父母答谢词
2015/01/04 职场文书
介绍信的写法
2015/01/31 职场文书
敬老院义诊活动总结
2015/05/07 职场文书
入党积极分子党支部意见
2015/06/02 职场文书
高中团支书竞选稿
2015/11/21 职场文书
用position:sticky完美解决小程序吸顶问题的实现方法
2021/04/24 HTML / CSS