Trait

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

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

1:example-1

TraitHello.php

<?php
trait TraitHello {
     function echoHello() {
        echo "hello";
     }
}

Hello.php

<?php
require_once "./TraitHello.php";
class Hello {
    use TraitHello;
}
$hello = new Hello();
$hello->echoHello();
    // 输出 hello
优先级

从基类继承的成员会被 trait 插入的成员所覆盖。优先顺序来自当前类的成员覆盖了 trait 的方法,而 trait 则覆盖了被继承的方法。

这个优先级解释的正的太绕了:
一句好就是 父类有 say方法,triat 也有say 方法,当前的子类既继承了父类,也 use 了trait,那么调用 say方法的优先级是 
1:当前类
2:trait
3:父类

示例代码:
Base.php

<?php
class Base {
    public function sayHello() {
    echo "hello";
 }
}

SayWorld.php

<?php
trait SayWorld {
    public function sayHello() {
    parent::sayHello(); // 先调用base类中的方法
    echo "world";
 }
}

MyHelloWorld.php

<?php
require_once './Base.php';
require_once './SayWorld.php';
class MyHelloWorld extends Base {
    use SayWorld;
}
$o = new MyHelloWorld();
$o->sayHello();

输出 hello.world..

多个 trait

通过逗号分割,在use 声明列出多个trait,都可以插入到一个类中


Gabriel
36 声望4 粉丝

引用和评论

0 条评论