繁体   English   中英

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

[英]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

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

关于A::callMe insteadof B::callMe

  • 在使用insteadof时,您不能在范围解析运算符:: (Paamayim Nekudotayim) 之后命名方法,因为 PHP 将查找具有相同名称的方法。 A::callMe insteadof B;
  • 您需要使用/导入/别名类名,或者使用命名空间\\Src\\Traits\\A::callMe insteadof \\Src\\PowerTraits\\B;引用完全限定的类\\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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM