PHP中Trait特性
Trait是自 PHP 5.4.0 起添加的一个新特性,是 PHP 多重继承的一种解决方案。例如,需要同时继承两个 Abstract Class, 这将会是件很麻烦的事情,Trait 就是为了解决这个问题。
下面是一个例子,类Demo同时继承了Test1、Test2:
<?php
trait Test1{
public function add($a, $b){
echo $a + $b;
}
}
trait Test2{
public function sub($a, $b){
echo $a - $b;
}
}
class Demo{
use Test1,Test2;
}
$obj = new Demo();
$obj->add(3, 5); // 8
$obj->sub(3, 5); // -2
一些特性
1、优先级:当前类 > trait > 基类 。 即当前类中的方法会覆盖 trait 方法,而 trait 方法又覆盖了基类中的方法。
2、多个 trait: 通过逗号分隔,在 use 声明列出多个 trait,可以都插入到一个类中。
3、冲突的解决:
如果两个 trait 都插入了一个同名的方法,如果没有明确解决冲突将会产生一个致命错误。
为了解决多个 trait 在同一个类中的命名冲突,需要使用 insteadof 操作符来明确指定使用冲突方法中的哪一个。
以上方式仅允许排除掉其它方法,as 操作符可以将其中一个冲突的方法以另一个名称来引入。
<?php
trait A {
public function smallTalk() {
echo 'a';
}
public function bigTalk() {
echo 'A';
}
}
trait B {
public function smallTalk() {
echo 'b';
}
public function bigTalk() {
echo 'B';
}
}
class Talker {
use A, B {
B::smallTalk insteadof A;
A::bigTalk insteadof B;
}
}
class Aliased_Talker {
use A, B {
B::smallTalk insteadof A;
A::bigTalk insteadof B;
B::bigTalk as talk;
}
}
?>
4、trait嵌套:Trait 之间也可以相互的嵌套:在 trait 定义时通过使用一个或多个 trait,它能够组合其它 trait 中的部分或全部成员。
5、Trait 的抽象方法:我们可以在 Trait 中声明需要实现的抽象方法,这样能使使用它的 Class 必须实现它。
需要注意的几点
Trait 会覆盖调用类继承的父类方法
Trait 无法如 Class 一样使用 new 实例化
单个 Trait 可由多个 Trait 组成
在单个 Class 中,可以使用多个 Trait
Trait 支持修饰词(modifiers),例如 final、static、abstract
我们能使用 insteadof 以及 as 操作符解决 Trait 之间的冲突
一些看法
坦白讲,第一眼看到 Trait 对它并没有任何好感。PHP5 以来带来的新特性已经足够得多,而且让开发者们有点应接不暇。
同时,Trait 更像是程序员的“语法糖”,然而它提供便利的同时可能会造成巨大的隐患。
针对类中已经实现的方法,Trait 没有效果。
探讨
那么 Trait 的出现是为何呢?有网友的回答比较有意思,但不无道理:
因为php没有javascript作用域链的机制,所以无法把function bind到class里面,曾经以为php 5.3的闭包可以做这个事,最后才发觉作用域的设计不允许这么干。
参考:
1、PHP: Traits - Manual
http://php.net/manual/zh/language.oop5.traits.php
2、PHP 5.4 的 Trait 特性_Web开发_酷勤网
http://www.kuqin.com/web/20111119/315048.html
PHP中Trait特性的更多相关文章
- 【Scala篇】--Scala中Trait、模式匹配、样例类、Actor模型
一.前述 Scala Trait(特征) 相当于 Java 的接口,实际上它比接口还功能强大. 模式匹配机制相当于java中的switch-case. 使用了case关键字的类定义就是样例类(case ...
- Laravel中Trait的用法实例详解
本文实例讲述了Laravel中Trait的用法.分享给大家供大家参考,具体如下: 看看PHP官方手册对Trait的定义: 自 PHP 5.4.0 起,PHP 实现了代码复用的一个方法,称为 trait ...
- PHP Trait特性
php类的单继承性,无法同时从两个基类中继承属性和方法,为了解决这个问题,使用Trait特性解决. Trait是一种代码复用技术,为PHP的单继承限制提供了一套灵活的代码复用机制. 用法:通过在类中使 ...
- php中trait(性状)与generator(生成器)
PHP中trait(性状)与generator(生成器) 一.trait (性状) 最近在看Josh Lockhat的<Modern PHP>,这本书很薄.但是其中给出了一个很重要的学习方 ...
- C#中的 特性 详解(转载)
本篇幅转载于:http://www.cnblogs.com/rohelm/archive/2012/04/19/2456088.html C#中特性详解 特性提供了功能强大的方法,用于将元数据或声明信 ...
- java 对象的this使用 java方法中参数传递特性 方法的递归
一.this关键字,使用的情形,以及如何使用. 1.使用的情形 类中的方法体中使用this --初始化该对象 类的构造器中使用this --引用,调用该方法的对象 2.不写this,调用 只要方法或 ...
- .net中的特性
本文来之:http://hi.baidu.com/sanlng/item/afa31eed0a383e0e570f1d3e 在一般的应用中,特性(Attribute,以称为属性)好像被使用的不是很多. ...
- Performance Tuning guide 翻译 || Performance Tuning Guide 11G中新增特性
CSDN 对格式支持比較弱.能够到http://user.qzone.qq.com/88285879/blog/1399382878 看一致的内容. Performance Tuning Guide ...
- C#中的特性 (Attribute) 入门 (二)
C#中的特性 (Attribute) 入门 (二) 接下来我们要自己定义我们自己的特性,通过我们自己定义的特性来描述我们的代码. 自定义特性 所有的自定义特性都应该继承或者间接的继承自Attribut ...
随机推荐
- extjs6环境
安装JDK http://www.oracle.com/technetwork/java/javase/downloads/ 安装到指定路径,例如D:\Java配置环境变量 此电脑—属性—高级系统设置 ...
- 《数据结构》 java的一维数组的内存结构与其特性
1{数组的概念: 数组是相同类型变量的集合,可以使用共同的名字引用它.数组也可以被定义为任何类型,可以是一维或者二维的.数组的访问时通过其对应的下标来实现的.数组提供了一种将有联系的信息便利分组的方式 ...
- python面向对象中的__init__方法怎么理解?
我们在学习python类的时候,总会碰见书上的类中有__init__()这样一个函数,很多同学百思不得其解,其实它就是python的构造方法. 构造方法类似于类似init()这种初始化方法,来初始化新 ...
- 使用IConfigurationSectionHandler在web.config中增加自定义配置
一. 场景 这里仅举一个简单应用的例子,我希望在web.config里面增加网站的基本信息,如:网站名称,网站版本号,是否将网站暂时关闭等.二. 基本实现方法1. 定义配置节点对应的类:Site ...
- ruby日记1
1.irb参数配置 ~/.irbrc IRB.conf[:PROMPT_MODE] = :SIMPLE #简化 irb 提示符,以及禁用一些烦人的自动缩进行为 IRB.conf[:AUTO_INDEN ...
- c++中的指针之指针在数组
使用一维指针数组输出一维数组中的数 int array[]={1,2,3,4,5,6}; int *p; p=array; for(int i=0;i<6;i++){ ...
- [Leetcode][JAVA] Insert Interval
Given a set of non-overlapping intervals, insert a new interval into the intervals (merge if necessa ...
- C++类的内存分配
今天面试被问到一个类的内存问题,有些记不清楚了.用了 C++这么年,实在是不应该. 于是上网查了一些资料,并做了实验,整理如下: 所用测试环境为64位mac air,编译器为XCode 1.最简单 c ...
- HTML5-格式化
<!DOCTYPE html> <html> <head lang="en"> <meta charset="UTF-8&quo ...
- 关于Mysql查询带单引号及插入带单引号字符串问题
1.转为带参数查询 String sql=""select id from student where name='?'; Connection connect = DriverM ...