【转】PHP的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 "method1"; }
} trait second_trait {
function second_method() { echo "method2"; }
} class first_class {
// now using more than one trait
use first_trait, second_trait;
} $obj= new first_class(); // Valid
$obj->first_method(); // Print : method1 // Valid
$obj->second_method(); // Print : method2
Trait 之间的嵌套
同时,Trait 之间也可以相互的嵌套,例如
trait first_trait {
function first_method() { echo "method1"; }
} trait second_trait {
use first_trait;
function second_method() { echo "method2"; }
} class first_class {
// now using
use second_trait;
} $obj= new first_class(); // Valid
$obj->first_method(); // Print : method1 // Valid
$obj->second_method(); // Print : method2
Trait 的抽象方法(Abstract Method)
我们可以在 Trait 中声明需要实现的抽象方法,这样能使使用它的 Class 必须实现它
trait first_trait {
function first_method() { echo "method1"; } // 这里可以加入修饰符,说明调用类必须实现它
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的Trait 特性的更多相关文章
- PHP中Trait特性
Trait是自 PHP 5.4.0 起添加的一个新特性,是 PHP 多重继承的一种解决方案.例如,需要同时继承两个 Abstract Class, 这将会是件很麻烦的事情,Trait 就是为了解决这个 ...
- trait特性
1.trait特性可以和特化或者偏特化结合. 2.trait可以和类型转换结合.
- PHP Trait特性
php类的单继承性,无法同时从两个基类中继承属性和方法,为了解决这个问题,使用Trait特性解决. Trait是一种代码复用技术,为PHP的单继承限制提供了一套灵活的代码复用机制. 用法:通过在类中使 ...
- php类知识---trait特性
#由于php类只支持单一继承,但我们又需要使用一些类的优秀特性,因此有了trait <?php trait cpc #trait 下的方法只能用public { function trainni ...
- PHP trait 特性在 Laravel 中的使用个人心得
trait 是在PHP5.4中为了方便代码复用的一种实现方式,但目前我在看的的PHP项目中较少看的有程序员去主动使用这个实现方式,在laravel中有很多 trait 的使用,关于trait 在 la ...
- 【Scala篇】--Scala中Trait、模式匹配、样例类、Actor模型
一.前述 Scala Trait(特征) 相当于 Java 的接口,实际上它比接口还功能强大. 模式匹配机制相当于java中的switch-case. 使用了case关键字的类定义就是样例类(case ...
- Laravel中Trait的用法实例详解
本文实例讲述了Laravel中Trait的用法.分享给大家供大家参考,具体如下: 看看PHP官方手册对Trait的定义: 自 PHP 5.4.0 起,PHP 实现了代码复用的一个方法,称为 trait ...
- scala当中的特质trait
1.将trait作为接口使用 Scala中的trait是一种特殊的概念: 首先先将trait作为接口使用,此时的trait就与Java中的接口 (interface)非常类似: 在trait中可以定义 ...
- php5.4.0以后加入trait实现代码复用【摘录】
在http://www.php.net/manual/zh/language.oop5.traits.php 查看了一下5.4.0提供的特性trait顺便做一个标记(总结): 首先要明确trait和类 ...
随机推荐
- Chrome 开发工具之Elements
友情提示:全文图片高能,如使用手机阅读,请确保在wifi情况下或者流量充足.图片有点渣,也算辛苦做出来的,请别嫌弃- Elements面板主要展示当前页面的组织结构,在如今的应用程序中,HTML页面初 ...
- javascript基本对象
1 String对象 创建对象 var string1 = new String("Hello"); var string2 = "Hello" //也可以创建 ...
- PHP日志记录规范PSR-3
.note-content { font-family: "Helvetica Neue", Arial, "Hiragino Sans GB", STHeit ...
- okhttp封装时,提示 cannot resolve method OkHttpClient setConnectTimeout() 函数
如标题所示,okhttp封装时,提示 cannot resolve method OkHttpClient setConnectTimeout() 函数,有遇到这样现象的朋友吗? 原因:因使用的是 ...
- nandflash的读写(2440)
说明: 根据物理结构上的区别 , NandFlash主要分为如下两类:1)•SLC (Single Level Cell): 单层式存储2)•MLC (Multi Level Cell): 多层式存储 ...
- zapewnia stale poprawiając relacje związane
W porównaniu do LG5, ta http://www.butyrunning.com/lunarestoa-2-m%C3%84%C2%99skie-c-2_70_71.html kon ...
- C++中有关数组的相关问题
1.数组长度相关: strlen(from <string.h>)只是针对字符数组才有的,他不包含\0的长度.无法对其他类型求长度.sizeof()则可以对\0发起作用.记住(a.leng ...
- webstorm快捷键大全
使用webstorm一段时间了,这里分享一下常用到的快捷键,不用死记,孰能生巧! Ctrl+/ 或 Ctrl+Shift+/ 注释(// 或者/*-*/ ) Shift+F6 重构-重命名 Ctrl+ ...
- 【Android自学日记】五大布局常用属性
线性布局(LinearLayout)常用属性: android:orientation="vertical"--决定子类控件的排布方式(vertical垂直:horizontal水 ...
- linux(centOS)下安装Oracle步骤
##创建用户和组: [LanRS@localhost ~]$ su root #切换到root Password: [root@localhost LanRS]# groupadd oinstall ...