Php 多个性状同时使用相同的基本性状
好吧,假设给出了以下条件:Php 多个性状同时使用相同的基本性状,php,traits,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; publi
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
}
}
我现在想实现一个类,它同时使用traitsa
和B
:
class MyClass
{
use A, B;
}
PHP告诉我它不能重新定义函数doSomething()
。是什么原因导致PHP无法检测到A
和B
具有相同的特性,并且不将其复制两次到MyClass
(这是一个bug还是一个阻止我编写不干净代码的特性)
对于我的问题,是否有更好的解决方案,而我最终采用的解决方案是:
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;
}
您可以使用“代替”解决此冲突,如下所示:
class MyClass
{
use A, B {
A::doSomething insteadof B;
}
}
class MyClass
{
use A, B, C, D {
A::doSomething insteadof B, C, D;
}
}
编辑
有关更多特性,解决冲突可以如下所示:
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-BaseTrait{
公共函数somethingBasic(){}
}
特征脚印{
使用基本特征;
}
巴特雷特特征{
使用基本特征;
}
PHP>=7.3:很好
谢谢你的回答。所以我必须为每个特征写一次?比如当我有特征A
,B
,C
,D
我必须写三次?这对我来说就像是一个“解决办法”,不知何故…@TiMESPLiNTER不,只需将它们全部添加到逗号分隔的地方:使用a,B,C,D{a::doSomething而不是B,C,D;}
我想我会继续我的初始解决方案。在我看来,这比而不是解决方案更清楚。因为使用traitsA
,B
,C
,D
的人也可以代替使用Base
trait直接在他们的类中实现doSomething()
函数(如果需要)。反正是Thx。如果没有人会提出另一个解决方案,我会接受这个方案。@TiMESPLiNTER很高兴我能帮上忙。当前类的成员重写Trait方法。使用而不是,您可以从类中调用该方法的特性中进行选择-对我来说,这很清楚。但是,当然,选择你喜欢的。