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 相关文章推荐
实战mysql导出中文乱码及phpmyadmin导入中文乱码的解决方法
Jun 11 PHP
PHP中防止SQL注入实现代码
Feb 19 PHP
php和数据库结合的一个简单的web实例 代码分析 (php初学者)
Jul 28 PHP
在PHP中设置、使用、删除Cookie的解决方法
May 06 PHP
php json与xml序列化/反序列化
Oct 28 PHP
php通过修改header强制图片下载的方法
Mar 24 PHP
yii2中使用Active Record模式的方法
Jan 09 PHP
PHP生成和获取XML格式数据的方法
Mar 04 PHP
php blowfish加密解密算法
Jul 02 PHP
PHP合并数组的2种方法小结
Nov 24 PHP
Laravel使用原生sql语句并调用的方法
Oct 09 PHP
PHP设计模式(观察者模式)
Jul 07 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 分页原理分析,大家可以看看
2009/12/21 PHP
php教程 插件机制在PHP中实现方案
2012/11/02 PHP
smarty自定义函数htmlcheckboxes用法实例
2015/01/22 PHP
PHP中addslashes()和stripslashes()实现字符串转义和还原用法实例
2016/01/07 PHP
Yii视图CGridView实现操作按钮定义地址示例
2016/07/14 PHP
php获取微信基础接口凭证Access_token
2018/08/23 PHP
laravel框架的安装与路由实例分析
2019/10/11 PHP
使用js获取地址栏中传递的值
2013/07/02 Javascript
js模拟点击以提交表单为例兼容主流浏览器
2013/11/29 Javascript
JavaScript中的undefined学习总结
2013/11/30 Javascript
JS替换文本域内的回车示例
2014/02/18 Javascript
js 获取页面高度和宽度兼容 ie firefox chrome等
2014/05/14 Javascript
jquery中post方法用法实例
2014/10/21 Javascript
JavaScript分析、压缩工具JavaScript Analyser
2014/12/31 Javascript
js创建对象的方法汇总
2016/01/07 Javascript
JavaScript 详解预编译原理
2017/01/22 Javascript
浅谈 Vue v-model指令的实现原理
2017/06/08 Javascript
JS实现websocket长轮询实时消息提示的效果
2017/10/10 Javascript
JavaScript设计模式之责任链模式实例分析
2019/01/16 Javascript
在小程序中推送模板消息的实现方法
2019/07/22 Javascript
解决layer.msg 不居中 ifram中的问题
2019/09/05 Javascript
Vue项目中数据的深度监听或对象属性的监听实例
2020/07/17 Javascript
[02:35]DOTA2超级联赛专访XB 难忘一年九冠称王
2013/06/20 DOTA
[01:52]DOTA2完美大师赛Vega战队趣味视频——kpii老师小课堂
2017/11/25 DOTA
python运用pygame库实现双人弹球小游戏
2019/11/25 Python
英国最大的宝石首饰超市:QP Jewellers
2018/09/23 全球购物
个人简历自我评价八例
2013/10/31 职场文书
大二法学专业职业生涯规划范文
2014/02/12 职场文书
食品业务员岗位职责
2014/03/18 职场文书
师德承诺书
2015/01/20 职场文书
保险公司2016开门红口号集锦
2015/12/24 职场文书
初二数学教学反思
2016/02/17 职场文书
MySQL索引知识的一些小妙招总结
2021/05/10 MySQL
浅谈mysql返回Boolean类型的几种情况
2021/06/04 MySQL
springboot利用redis、Redisson处理并发问题的操作
2021/06/18 Java/Android
Python+Matplotlib图像上指定坐标的位置添加文本标签与注释
2022/04/11 Python