避免特质碰撞 - use_once?

wog*_*and 9 php inheritance multiple-inheritance

我有两个PHP特征,每个特征都继承自相同的第三特征:

trait C {
    public function smallTalk() {
        echo 'c';
    }
}

trait A {
    use C;
    public function ac() {
        echo 'a'.smallTalk();
    }
}

trait B {
    use C;
    public function bc() {
        echo 'b'.smallTalk();
    }
}
Run Code Online (Sandbox Code Playgroud)

我想在课堂上使用它们:

class D {
    use A, B;
    public function acbc() {
        echo ac().bc();
    }
}
Run Code Online (Sandbox Code Playgroud)

但我一直在收到错误

致命错误:特征方法smallTalk尚未应用,因为与D上的其他特征方法存在冲突

我知道use_once这不是一件事,但我正在寻找相同的功能require_onceinclude_once提供,但对于特征.这个例子很简单.我的真实C有很多方法,并且被超过2个特征所继承,所以我真的不想在insteadof每次使用超过1个这些特征时重复长字符串.

Max*_*ach 3

您需要阅读:冲突解决

如果两个 Traits 插入一个同名的方法,并且没有显式解决冲突,则会产生致命错误。

要解决同一类中使用的 Traits 之间的命名冲突, 需要使用替代运算符来准确选择冲突的方法之一

由于这只允许排除方法,因此可以使用as运算符允许以另一名称包含冲突方法之一。

例子:

<?php
trait A {
    public function smallTalk() {
        echo 'a';
    }
    public function bigTalk() {
        echo 'A';
    }
}

trait B {
    public function smallTalk() {
        echo 'b';
    }
    public function bigTalk() {
        echo 'B';
    }
}

class Talker {
    use A, B {
        B::smallTalk insteadof A;
        A::bigTalk insteadof B;
    }
}

class Aliased_Talker {
    use A, B {
        B::smallTalk insteadof A;
        A::bigTalk insteadof B;
        B::bigTalk as talk;
    }
}
Run Code Online (Sandbox Code Playgroud)