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

Multiple traits uses same base trait at the same time

好吧,假设有以下问题:

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
    }
}

我现在想实现一个 class,它同时使用 AB:

class MyClass
{
    use A, B;
}

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
    }
}

然后是我的 class:

class MyClass
{
    use Base, A, B;
}

您可以像这样解决与 "insteadof" 的冲突:

class MyClass
{
    use A, B {
        A::doSomething insteadof B;
    }
} 

编辑 对于更多的特征,解决冲突可以是这样的:

class MyClass
{
    use A, B, C, D {
        A::doSomething insteadof B, C, D;
    }
}  

这已在 PHP 7.3 中修复:

trait A
{
    public function a(){}
}

trait B
{
    use A;
}

trait C
{
    use A;
}

class D
{
    use B, C;
}

结果:

PHP 7.3+ Fine
PHP ^5|^7.2: Fatal error: Trait method a has not been applied, because there are collisions with other trait methods on D in /in/Z5GTo on line 18

@Grzegorz 的支持,将 link 发布到 PHP 错误,一个答案,但被投票删除。我尝试重新打开它,但打不开。