解決衝突

嘗試將多個特徵用於一個類可能會導致涉及衝突方法的問題。你需要手動解決此類衝突。

例如,讓我們建立這個層次結構:

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();

此程式碼將生成以下輸出: