Как я могу удалить коллизии методов черт, используя черты и классы, которые находятся в разных пространствах имен?

Я продолжаю получать ошибку 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, если traits и вызывающий класс находятся в разных пространствах имен?

2

Решение

В отношении A::callMe insteadof B::callMe

  • Вы не можете назвать метод после оператора разрешения области :: (Paamayim Nekudotayim) при использовании insteadof потому что 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();
}

Черта А

1

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]