多个特征同时使用相同的基本特征

TiM*_*TER 4 php traits

好吧,下面给出了两难处境:

trait Base
{
    public function doSomething()
    {
        // Do fancy stuff needed in other traits
    }
}

trait A
{
    use Base;

    public function foo()
    {
        // Do something
    }
}


trait B
{
    use Base;

    public function bar()
    {
        // Do something else
    }
}
Run Code Online (Sandbox Code Playgroud)

而且我现在想实现一个同时使用trait A和的类B

class MyClass
{
    use A, B;
}
Run Code Online (Sandbox Code Playgroud)

PHP告诉我它不能重新定义函数doSomething()。PHP无法检测到该特征AB共享一个相同特征并且不将其复制两次的原因MyClass是什么(这是错误还是阻止我编写不干净代码的功能)?

有没有比我最终解决的更好的解决方案了?

trait Base
{
    public function doSomething()
    {
        // Do fancy stuff needed in other traits
    }
}

trait A
{
    abstract function doSomething();

    public function foo()
    {
        // Do something
    }
}


trait B
{
    abstract function doSomething();

    public function bar()
    {
        // Do something else
    }
}
Run Code Online (Sandbox Code Playgroud)

然后我的课:

class MyClass
{
    use Base, A, B;
}
Run Code Online (Sandbox Code Playgroud)

arb*_*tes 5

您可以使用“代替”来解决此冲突,如下所示:

class MyClass
{
    use A, B {
        A::doSomething insteadof B;
    }
} 
Run Code Online (Sandbox Code Playgroud)

编辑 对于更多的特质,解决冲突可以如下所示:

class MyClass
{
    use A, B, C, D {
        A::doSomething insteadof B, C, D;
    }
}  
Run Code Online (Sandbox Code Playgroud)