好的说下面的困境是:
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
}
}
我想现在实现一个使用特征A
和B
的类:
class MyClass
{
use A, B;
}
PHP告诉我它无法重新定义函数doSomething()
。是什么原因导致PHP无法检测到A
和B
分享同一个特征并且不会将其复制两次到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;
}
答案 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 提供原始答案的道具,该答案被投票不公平地删除了。我试图重新打开它,但不能。