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

时间:2015-08-12 10:47:06

标签: 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
    }
}

我想现在实现一个使用特征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 MyClass
{
    use Base, A, B;
}

2 个答案:

答案 0 :(得分:5)

您可以使用"而不是"来解决此冲突。像这样:

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

修改 对于更多特征,解决冲突可能如下所示:

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

答案 1 :(得分:0)

这已在 PHP 7.3 中修复:

trait BaseTrait {
  public function somethingBasic() {}
}

trait FooTrait {
  use BaseTrait;  
}

trait BarTrait {
  use BaseTrait;
}

PHP >= 7.3: Fine
PHP <= 7.2: PHP Fatal error:  Trait method somethingBasic has not been applied, because there are collisions with other trait methods on

向@Grzegorz 提供原始答案的道具,该答案被投票不公平地删除了。我试图重新打开它,但不能。