PHP之Trait

Trait

PHP是单继承语言,无法多继承,为了解决这个问题,在PHP5.4时出现了Trait,提供了一种代码复用机制。

用法: 通过在类中使用use 关键字,声明要组合的Trait名称,具体的Trait的声明使用Trait关键词,Trait不能实例化 。

例子:

<?php
trait B {
}
class A {
  use B;
}

Trait 是为类似 PHP 的单继承语言而准备的一种代码复用机制。Trait 为了减少单继承语言的限制,使开发人员能够自由地在不同层次结构内独立的类中复用 method。

当不同类都用到一些相同功能时就会出问题。例如,几个类都需要生成单例,由于 PHP 不支持多继承,那么只能在每个类重复编写代码,或者说将单例功能写在父类中并让这几个类都继承这个父类,这种继承是无意义的。Trait 提供了这类问题的解决方案。

代码实现:

<?php
trait Singleton
{
    private static $instance;

    public static function getInstance() {
        if (!(self::$instance instanceof self)) {
             self::$instance = new self;
         }
         return self::$instance;
     }
 }class Db
{
    use Singleton;
}class Log
{
    use Singleton;
}
​
$db = Db::getInstance();
$log = Log::getInstance();
var_dump($db, $log);

打印结果如下:

class Db#1 (0) {
}
class Log#2 (0) {
}

由此实现了代码复用,多继承的效果。

Trait优先顺序

如果父类,当前类和Trait都有相同方法,优先级则是如下:

当前类>Trait>父类

多个Trait冲突解决

  1. insteadof指定使用哪一个trait方法
    use A, B {
    B::a insteadof A;//a方法冲突时使用B类的a方法而不使用A类的a方法
    A::b insteadof B; //b方法冲突时使用A类的b方法而不使用B类的b方法
    }
  2. 通过as关键字指定别名
    use A, B {
    B::a as c; //声明B类的a方法为c,作用于该类
    A::b as d; //声明A类的b方法为d,作用于该类
    }
本作品采用《CC 协议》,转载必须注明作者和本文链接
lemon_lyue
讨论数量: 0
(= ̄ω ̄=)··· 暂无内容!

讨论应以学习和精进为目的。请勿发布不友善或者负能量的内容,与人为善,比聪明更重要!