如何使用不同命名空间中的特征和类删除特征方法冲突?

时间:2016-05-12 17:52:23

标签: php namespaces traits collision

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

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

单独留下,给出碰撞警告:

JSON.parse()

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

1 个答案:

答案 0 :(得分:1)

关于A::callMe insteadof B::callMe

  • 使用::时,无法使用范围解析运算符insteadof(Paamayim Nekudotayim)命名方法,因为PHP将查找同名的方法。 A::callMe insteadof B;
  • 您需要使用/ import /别名类名,或引用名称空间为\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();
}
  

特质A