PHP trait 特性

trait是PHP自5.4版本之后加入的一种新的代码复用机制,是一种细粒度代码复用的方法。官方文档对于trait给出的解释是:

自 PHP 5.4.0 起,PHP 实现了一种代码复用的方法,称为 trait。

Trait 是为类似 PHP 的单继承语言而准备的一种代码复用机制。Trait 为了减少单继承语言的限制,使开发人员能够自由地在不同层次结构内独立的类中复用 method。Trait 和 Class 组合的语义定义了一种减少复杂性的方式,避免传统多继承和 Mixin 类相关典型问题。

Trait 和 Class 相似,但仅仅旨在用细粒度和一致的方式来组合功能。 无法通过 trait 自身来实例化。它为传统继承增加了水平特性的组合;也就是说,应用的几个 Class 之间不需要继承。

trait 单词的释义为特性,很好的解释了trait这种方法的特点,可以在不同层次结构内独立的类中复用方法和属性,以一种易于理解的方式来举例,在网络游戏《魔兽世界》当中,法师,潜行者,战士是三个玩家可以操控的职业,三个职业是平等的,可以理解为继承自“角色”这一父类, 因为不管玩家使用什么职业,都能够使用坐骑,所以,父类“Character”中便可以添加一个ride()方法,表示使用坐骑,这样所有继承自“Character”的职业便都有了使用坐骑的能力。而不同的职业又有各自的特点,比如说,法师能够使用暴风雪,潜行者能够潜行,战士能够冲锋,因此,“mage”类中可以增加“blizzard”方法表示法师使用暴风雪技能,“rogue”类中加入“stealth”方法表示潜行者使用潜行技能,“worrior”类中可以增加“charge”方法表示战士使用冲锋技能,这样各职业的特点便能体现出来。而当分配装备时,问题就来了,众所周知《魔兽世界》的装备系统十分庞大,护甲分为布甲、皮甲、锁甲、板甲四种不同的种类,而不同的职业能够装备的护甲类型不完全相同,有些职业只可以装备一种类型的护甲,而有的职业可以装备大部分类型的护甲,这种时候,为了避免重复定义,trait就能够派上用场了。我们在这里定义“布甲”(cloth armour)、“皮甲”(leather armour)、“板甲”(plate armour)三个不同的trait,表示一个职业可以装备某一种护甲,这样我们定义一个职业的时候,便可以通过插入trait来定义这个职业能够装备的护甲类型,而这样一个特性又是独立于职业之外的,多个职业可以共同享有一个特性,比如,战士既可以装备板甲,也可以装备布甲,这样在声明战士这个类的时候,便可以插入多条特性,来表示战士是具有作为一个全需党的条件的:

 1 trait ClothArmour
 2 {
 3     public function putOnClothArmour()
 4     {
 5     //穿上一件布甲
 6     }
 7 }
 8 trait LeatherArmour
 9 {
10     public function putOnLeatherArmour()
11     {
12     //穿上一件皮甲
13     }
14 }
15 trait PlateArmour
16 {
17     public function putOnPlateArmour()
18     {
19     //穿上一件板甲
20     }
21 }
22 class Character
23 {
24     public function ride(){
25     //召唤坐骑
26     }
27 }
28 //法师
29 class Mage extends Character
30 {
31     use ClothArmour;
32     public function blizzard(){
33     //使用“暴风雪”
34     }
35 }
36 //战士
37 class Worrior extends Character
38 {
39     use ClothArmour,LeatherArmour,PlateArmour;
40     public function charge(){
41     //使用“冲锋”
42     }
43 }
44 //潜行者
45 class rogue extends Character
46 {
47     use ClothArmour,LeatherArmour;
48     public function stealth(){
49     //使用“潜行”
50     }
51 }
52 $worrior = new Worrior();
53 //继承自父类的方法,召唤坐骑
54 $worrior->ride();
55 //自身的方法,使用冲锋技能
56 $worrior->charge();
57 //战士能够装备布甲
58 $worrior->putOnClothArmour();
59 //战士能够装备皮甲
60 $worrior->putOnLeatherArmour();
61  //战士能够装备板甲
62 $worrior->putOnPlateArmour();

在这个事例中,就可以看到trait最基础的使用方法,trait其实是一组描述了某个特性的一些属性和方法的集合,能够很方便地进行组合与应用,耦合性低,易于维护,同时特性的引入也在某些程度上减少了层层继承之后必须不断追溯父类寻找某些方法的情况,提高的代码的可读性,对于提升开发工作的效率以及开发团队合作是非常好的。

时间: 2024-08-28 15:58:15

PHP trait 特性的相关文章

PHP Trait特性

php类的单继承性,无法同时从两个基类中继承属性和方法,为了解决这个问题,使用Trait特性解决.用法:通过在类中使用use 关键字,声明要组合的Trait名称,具体的Trait的声明使用Trait关键词.  注意:Trait不能实例化 demo示例: 1 <?php 2 trait Dog{ 3 public function dog(){ 4 echo 'This trair dog'; 5 } 6 } 7 8 trait Fish{ 9 public function fish(){ 10

【转】PHP的Trait 特性

Trait是在PHP5.4中加入的,它既不是接口也不是类.主要是为了解决单继承语言的限制.是PHP多重继承的一种解决方案.例如,需要同时继承两个 Abstract Class, 这将会是件很麻烦的事情,Trait 就是为了解决这个问题.它能被加入到一个或多个已经存在的类中.它声明了类能做什么(表明了其接口特性),同时也包含了具体实现(表明了其类特性) 简单使用 首先,当然是声明个 Trait,PHP5.4 增加了 trait 关键字 1 trait first_trait { 2 functio

PHP之Trait特性

自 PHP 5.4.0 起,PHP 实现了一种代码复用的方法,称为 trait. Trait 是为类似 PHP 的单继承语言而准备的一种代码复用机制.Trait 为了减少单继承语言的限制,使开发人员能够自由地在不同层次结构内独立的类中复用 method.Trait 和 Class 组合的语义定义了一种减少复杂性的方式,避免传统多继承和 Mixin 类相关典型问题. Trait 和 Class 相似,但仅仅旨在用细粒度和一致的方式来组合功能. 无法通过 trait 自身来实例化.它为传统继承增加了

【Scala篇】--Scala中Trait、模式匹配、样例类、Actor模型

一.前述 Scala Trait(特征) 相当于 Java 的接口,实际上它比接口还功能强大. 模式匹配机制相当于java中的switch-case. 使用了case关键字的类定义就是样例类(case classes),样例类是种特殊的类. Actor相当于Java中的多线程. 二.具体阐述 trait特性 1.概念理解 Scala Trait(特征) 相当于 Java 的接口,实际上它比接口还功能强大. 与接口不同的是,它还可以定义属性和方法的实现. 一般情况下Scala的类可以继承多个Tra

php laravel 安装

windows环境尝试学习一下laravel 1.因为SAE的php版本为5.3,因此最高只能支持到Laravel4.1.x.(Laravel4.2用到了php5.4的trait特性) 以4.1为主.本地php版本升级到5.3.10 2. https://getcomposer.org/download/ 安装composer ,安装形式 安装后重新打开cmd,可以使用该命令. 3. 安装laravel 参考 http://blog.csdn.net/thy38/article/details/

(转)Yii的组件机制之一:组件基础类CComponent分析

Yii的组件机制 组件机制,是Yii整个体系的思想精髓,在使用Yii之前,最应该先了解其组件机制,如果不了解这个机制,那么阅读Yii源代码会非常吃力.组件机制给Yii框架赋予了无穷的灵活性和可扩展性,可以毫不夸张地说,Yii框架的基础结构就是组件.大到CApplication对象.控制器.路由管理器(urlManager),小到一些其它插件,均是以组件形式存在的. 什么是Yii组件? Yii中几乎所有可实例化并继承自CComponent的类,均可称为组件. 组件的特点是什么? 继承自CCompo

jQuery中的编程范式

浏览器前端编程的面貌自2005年以来已经发生了深刻的变化,这并不简单的意味着出现了大量功能丰富的基础库,使得我们可以更加方便的编写业务代码,更重要的是我们看待前端技术的观念发生了重大转变,明确意识到了如何以前端特有的方式释放程序员的生产力.本文将结合jQuery源码的实现原理,对javascript中涌现出的编程范式和常用技巧作一简单介绍.    1. AJAX: 状态驻留,异步更新      首先来看一点历史. A. 1995年Netscape公司的Brendan Eich开发了javacri

只需手动增加一行代码即可让Laravel4运行在SAE

Github:https://github.com/chariothy/laravel4-sae laravel4-sae 只需手动增加一行代码即可让Laravel4(~4.2)运行在SAE,而且在本地和在SAE开发无需命令切换,自动判断环境并切换配置. 安装 在SAE安装Laravel 在SAE安装Laravel与本地环境安装稍有区别: 在SAE的"应用管理"中新建一个没有代码的应用,比如叫project-name(这里面只是便于举例,实际上SAE不允许用字符'-'): 用svn将其

phpDocumentor学习使用记录

一.phpDocumentor简介 PHPDocumentor是一个用PHP写的工具,对于有规范注释的php程序,它能够快速生成具有相互参照,索引等功能的API文档.老的版本是phpdoc,从1.3.0开始,更名为phpDocumentor,新的版本加上了对php5语法的支持,同时,可以通过在客户端浏览器上操作生成文档,文档可以转换为PDF,HTML,CHM几种形式,非常的方便. phpDocumentor是一个非常强大的文档自动生成工具,利用它可以帮助我们编写规范的注释,生成易于理解,结构清晰