liushannet

php5.4新特性 traits(不知道中文翻译叫什么)

traits 作用: 代码复用,变相实现多重继承,或者叫类的代码片段

声明:

trait trait_name {
    //method
    //attribute 
    //跟class类似   
}

 调用:

trait trait_name2 {//组合多个trait
    use trait_name1;
abstract public function getWorld();//可以声明抽象方法 }
class class_name{ use trait_name1,trait_name2;
   public function getWorld(){}//需要实现抽象方法 }

注意:

1. trait 不可实例化,trait 只是代码片段,当有继承时,use trait 将覆盖父类方法

2. trait 可以声明抽象方法,静态方法等

3. 使用 trait 之间不可有相同的方法或属性声明,出现相同使用时需处理,如下:

<?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\';
    }
}
trait C {
    public function smallTalk() {
        echo \'c\';
    }
    public function bigTalk() {
        echo \'C\';
    }
}
class Talker {
    use A, B,C {
        B::smallTalk insteadof A,C;//必须处理冲突的名,指定默认使用
        B::bigTalk insteadof A,C;//必须处理冲突的名,指定默认使用
        A::bigTalk as AbigTalk;//如果需使用其他类的方法,对方法重命名
        C::bigTalk as CbigTalk;//如果需使用其他类的方法,对方法重命名
        C::smallTalk as protected CsmallTalk;//如果需使用其他类的方法,对方法重命名,且修改方法可见性
        A::smallTalk as protected;//如果需使用其他类的方法,修改方法可见性
    }
}
$a=new Talker();
$a->AbigTalk();

4.本类声明的方法将重写父类的方法或trait的方法

5. 不能实现接口(implements),继承(entends)等.(继承可以用类似的use 来实现)

 

官方介绍:http://php.net/manual/zh/language.oop5.traits.php

分类:

技术点:

相关文章: