如何使用不同名称空间中的特征和类来消除特征方法冲突


How can i remove trait method collisions using traits and classes that are in different namespaces?

我一直收到一个php错误,表明该方法不在当前类中,或者存在冲突。参见错误:

Trait method callMe has not been applied, because there are collisions with other trait methods on Src'Classes'A in
C:'wamp'www'src'classes'a.php on line 72

我试过了,但找不到解决办法。这就是我想要实现的目标:

trait A // namespace Src'Traits;
{
     function callMe()
     {}
}
trait B // namespace Src'PowerTraits;
{
     function callMe()
     {}
}
class A // Namespace Src'Classes;
{
    use 'Src'Traits'A;
    use 'Src'PowerTraits'B {
        A::callMe insteadof B::callMe;
    }
}

当我尝试时

A::callMe insteadof callMe;

我得到以下错误(可以理解,它显然在错误的命名空间中):

Could not find trait Src'Classes'callMe

也尝试过:

'Src'Traits'A::callMe insteadof 'Src'Traits'B::callMe (error, syntax error);
'Src'Traits'A::callMe insteadof B::callMe (error: wrong namespace);
'Src'Traits'A::callMe as NewA (error, collision warning);
'Src'Traits'A::callMe as 'Src'Traits'A::NewA (error, syntax error);

单独放置,发出碰撞警告:

Trait method callMe has not been applied, because there are collisions with other trait methods

当trait和调用类都在不同的命名空间中时,如何覆盖trait方法?

关于A::callMe insteadof B::callMe

  • 在使用insteadof时,不能使用作用域解析运算符::(Paamayim-Nekudotayim)命名方法,因为PHP会查找同名的方法。A::callMe insteadof B;
  • 您需要使用/import/alias类名,或者引用命名空间为'Src'Traits'A::callMe insteadof 'Src'PowerTraits'B;的完全限定类

演示:https://3v4l.org/g1ltH

<?php
namespace Src'Traits
{
    trait A
    {
        function callMe()
        {
            echo 'Trait A';
        }
    }
}
namespace Src'PowerTraits
{
    trait B
    {
        function callMe()
        {
            echo 'PowerTrait B';
        }
    }
}
namespace Src'Classes
{
    class A
    {
        use 'Src'Traits'A;
        use 'Src'PowerTraits'B {
            'Src'Traits'A::callMe insteadof 'Src'PowerTraits'B;
        }
    }
}
namespace
{
    (new 'Src'Classes'A)->callMe();
}

Trait A