解決衝突
嘗試將多個特徵用於一個類可能會導致涉及衝突方法的問題。你需要手動解決此類衝突。
例如,讓我們建立這個層次結構:
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();
此程式碼將生成以下輸出:
喵
喔