解决冲突
尝试将多个特征用于一个类可能会导致涉及冲突方法的问题。你需要手动解决此类冲突。
例如,让我们创建这个层次结构:
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();
此代码将生成以下输出:
喵
喔