Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/264.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 多个性状同时使用相同的基本性状_Php_Traits - Fatal编程技术网

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
    }
}
我现在想实现一个类,它同时使用traits
a
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;}
我想我会继续我的初始解决方案。在我看来,这比
而不是
解决方案更清楚。因为使用traits
A
B
C
D
的人也可以代替使用
Base
trait直接在他们的类中实现
doSomething()
函数(如果需要)。反正是Thx。如果没有人会提出另一个解决方案,我会接受这个方案。@TiMESPLiNTER很高兴我能帮上忙。当前类的成员重写Trait方法。使用
而不是
,您可以从类中调用该方法的特性中进行选择-对我来说,这很清楚。但是,当然,选择你喜欢的。