【转】PHP的Trait 特性

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

简单使用

首先,当然是声明个 Trait,PHP5.4 增加了 trait 关键字

1 trait first_trait {
2      function first_method() { /* Code Here */ }
3      function second_method() { /* Code Here */ }
4 }

同时,如果要在 Class 中使用该 Trait,那么使用 use 关键字

 1 class first_class {
 2     // 注意这行,声明使用 first_trait
 3     use first_trait;
 4 }
 5
 6 $obj = new first_class();
 7
 8 // Executing the method from trait
 9 $obj->first_method(); // valid
10 $obj->second_method(); // valid

使用多个 Trait

在同个 Class 中可以使用多个 Trait

 1 trait first_trait
 2 {
 3     function first_method() { echo "method1"; }
 4 }
 5
 6 trait second_trait {
 7     function second_method() { echo "method2"; }
 8 }
 9
10 class first_class {
11     // now using more than one trait
12     use first_trait, second_trait;
13 }
14
15 $obj= new first_class();
16
17 // Valid
18 $obj->first_method(); // Print : method1
19
20 // Valid
21 $obj->second_method(); // Print : method2

Trait 之间的嵌套

同时,Trait 之间也可以相互的嵌套,例如

 1 trait first_trait {
 2     function first_method() { echo "method1"; }
 3 }
 4
 5 trait second_trait {
 6     use first_trait;
 7     function second_method() { echo "method2"; }
 8 }
 9
10 class first_class {
11     // now using
12     use second_trait;
13 }
14
15 $obj= new first_class();
16
17 // Valid
18 $obj->first_method(); // Print : method1
19
20 // Valid
21 $obj->second_method(); // Print : method2

Trait 的抽象方法(Abstract Method)

我们可以在 Trait 中声明需要实现的抽象方法,这样能使使用它的 Class 必须实现它

 1 trait first_trait {
 2     function first_method() { echo "method1"; }
 3
 4     // 这里可以加入修饰符,说明调用类必须实现它
 5     abstract public function second_method();
 6 }
 7
 8 class first_method {
 9     use first_trait;
10
11     function second_method() {
12         /* Code Here */
13     }
14 }

Trait 冲突

多个 Trait 之间同时使用难免会冲突,这需要我们去解决。PHP5.4 从语法方面带入了相关 的关键字语法:insteadof 以及 as ,用法参见

 1 trait first_trait {
 2     function first_function() {
 3         echo "From First Trait";
 4     }
 5 }
 6
 7 trait second_trait {
 8     // 这里的名称和 first_trait 一样,会有冲突
 9     function first_function() {
10         echo "From Second Trait";
11     }
12 }
13
14 class first_class {
15     use first_trait, second_trait {
16         // 在这里声明使用 first_trait 的 first_function 替换
17         // second_trait 中声明的
18         first_trait::first_function insteadof second_trait;
19     }
20 }
21
22 $obj = new first_class();
23
24 // Output: From First Trait
25 $obj->first_function();

上面就是些 Trait 比较基本的使用了,更详细的可以参考官方手册。这里总结下注意的几 点:

  • Trait 会覆盖调用类继承的父类方法
  • Trait 无法如 Class 一样使用 new 实例化
  • 单个 Trait 可由多个 Trait 组成
  • 在单个 Class 中,可以使用多个 Trait
  • Trait 支持修饰词(modifiers),例如 final、static、abstract
  • 我们能使用 insteadof 以及 as 操作符解决 Trait 之间的冲突

文章出处:http://www.kuqin.com/web/20111119/315048.html

时间: 2024-08-11 04:05:03

【转】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是PHP自5.4版本之后加入的一种新的代码复用机制,是一种细粒度代码复用的方法.官方文档对于trait给出的解释是: 自 PHP 5.4.0 起,PHP 实现了一种代码复用的方法,称为 trait. Trait 是为类似 PHP 的单继承语言而准备的一种代码复用机制.Trait 为了减少单继承语言的限制,使开发人员能够自由地在不同层次结构内独立的类中复用 method.Trait 和 Class 组合的语义定义了一种减少复杂性的方式,避免传统多继承和 Mixin 类相关典型问题. Tr

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是一个非常强大的文档自动生成工具,利用它可以帮助我们编写规范的注释,生成易于理解,结构清晰