好吧,下面给出了两难处境:
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无法检测到该特征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
}
}
Run Code Online (Sandbox Code Playgroud)
然后我的课:
class MyClass
{
use Base, A, B;
}
Run Code Online (Sandbox Code Playgroud)
您可以使用“代替”来解决此冲突,如下所示:
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)