解决冲突

尝试将多个特征用于一个类可能会导致涉及冲突方法的问题。你需要手动解决此类冲突。

例如,让我们创建这个层次结构:

trait MeowTrait {
    public function say() {
        print "Meow \n";
    }
}

trait WoofTrait {
    public function say() {
        print "Woof \n";
    }
}

abstract class UnMuteAnimals {
    abstract function say();
}

class Dog extends UnMuteAnimals {
    use WoofTrait;
}

class Cat extends UnMuteAnimals {
    use MeowTrait;
}

现在,让我们尝试创建以下类:

class TalkingParrot extends UnMuteAnimals {
    use MeowTrait, WoofTrait;
}

php 解释器将返回致命错误:

致命错误: 没有应用 Trait 方法,因为在 TalkingParrot 上存在与其他特征方法的冲突

要解决此冲突,我们可以这样做:

  • 使用关键字 insteadof 来从一个特征中使用该方法而不是从另一个特征中使用该方法
  • 使用像 WoofTrait::say as sayAsDog; 这样的结构为方法创建别名
class TalkingParrotV2 extends UnMuteAnimals {
    use MeowTrait, WoofTrait {
        MeowTrait::say insteadof WoofTrait;
        WoofTrait::say as sayAsDog;
    }
}

$talkingParrot = new TalkingParrotV2();
$talkingParrot->say();
$talkingParrot->sayAsDog();

此代码将生成以下输出: