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修改时间格式的代码
May 29 PHP
使用GDB调试PHP代码,解决PHP代码死循环问题
Mar 02 PHP
jQuery+Ajax+PHP“喜欢”评级功能实现代码
Oct 08 PHP
php+js实现百度地图多点标注的方法
Nov 30 PHP
PHP实现的登录页面信息提示功能示例
Jul 24 PHP
PHP实现的自定义图像居中裁剪函数示例【测试可用】
Aug 11 PHP
laravel 中如何使用ajax和vue总结
Aug 16 PHP
使用YII2框架实现微信公众号中表单提交功能
Sep 04 PHP
Laravel 5使用Laravel Excel实现Excel/CSV文件导入导出的功能详解
Oct 11 PHP
PHP生成随机数的方法总结
Mar 01 PHP
ThinkPHP框架实现的MySQL数据库备份功能示例
May 24 PHP
PHP基于ip2long实现IP转换整形
Dec 11 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 nl2br函数 将换行字符转成 <br>
2009/08/21 PHP
php判断电子邮件是否正确方法
2018/12/04 PHP
JavaScript 学习笔记(十六) js事件
2010/02/01 Javascript
jquery实现的导航固定效果
2014/04/28 Javascript
JavaScript使用cookie记录临时访客信息的方法
2015/04/07 Javascript
js精美的幻灯片画集特效代码分享
2015/08/29 Javascript
详解JavaScript基于面向对象之继承
2015/12/13 Javascript
纯js和css完成贪吃蛇小游戏demo
2016/09/01 Javascript
AngularJS中的Promise详细介绍及实例代码
2016/12/13 Javascript
js 转义字符及URI编码详解
2017/02/28 Javascript
jquery中封装函数传递当前元素的方法示例
2017/05/05 jQuery
JavaScript的继承实现小结
2017/05/07 Javascript
React-router中结合webpack实现按需加载实例
2017/05/25 Javascript
原生JS实现循环Nodelist Dom列表的4种方式示例
2018/02/11 Javascript
Vue通过getAction的finally来最大程度避免影响主数据呈现问题
2020/04/24 Javascript
关于Node.js中频繁修改代码重启服务器的问题
2020/10/15 Javascript
Python实现约瑟夫环问题的方法
2016/05/03 Python
Python自定义装饰器原理与用法实例分析
2018/07/16 Python
python队列Queue的详解
2019/05/10 Python
使用Flask-Cache缓存实现给Flask提速的方法详解
2019/06/11 Python
对django的User模型和四种扩展/重写方法小结
2019/08/17 Python
Python底层封装实现方法详解
2020/01/22 Python
TensorFlow实现模型断点训练,checkpoint模型载入方式
2020/05/26 Python
浅谈keras 的抽象后端(from keras import backend as K)
2020/06/16 Python
python中把元组转换为namedtuple方法
2020/12/09 Python
CSS3实现跳动的动画效果
2016/09/12 HTML / CSS
乔丹诺(Giordano)酒庄德国官网:找到最好的意大利葡萄酒
2017/12/28 全球购物
什么是Remote Module
2016/06/10 面试题
党的群众路线教育实践活动批评与自我批评
2014/02/16 职场文书
质量月活动策划方案
2014/03/10 职场文书
创建无烟单位实施方案
2014/03/29 职场文书
厨师个人自我鉴定范文
2014/04/19 职场文书
个人学习群众路线心得体会
2014/11/05 职场文书
不尊敬老师检讨书范文
2014/11/19 职场文书
微信小程序 WeUI扩展组件库的入门教程
2022/04/21 Javascript