Как переопределить метод черты в абстрактном классе?

Я застрял в проблеме с чертами, которые я не могу решить самостоятельно.

я имею расширение классов абстрактный класс (в моем случае это несколько классов контроллеров и абстрактный класс Controllerиспользуемый каркас не будет здесь важен, так как это общий вопрос PHP…) который использует черты. Я бы хотел переопределить метод определены в одной из черт. Это работает только до тех пор, пока я определяю метод в моих подклассах, но не в моем абстрактном классе.


Итак, этот работает отлично:

class MyController extends Controller
{
use AnyTrait;

public function anyMethodFromAnyTrait()
{
// override AnyTrait::anyMethodFromAnyTrait()
}
}

Я также знаю, как позвонить anyMethodFromAnyTrait метод из AnyTrait используя as,

class MyController extends Controller
{
use AnyTrait { AnyTrait::anyMethodFromAnyTrait as method }

public function anyMethodFromAnyTrait()
{
// invoke AnyTrait::anyMethodFromAnyTrait()
$this->method();
}
}

Оба работают как шарм.


Но моя проблема немного другая.

При использовании черты и определения метода в моем абстрактный класс я не может переопределить метод черты.

Предположим, что следующий класс контроллера:

class MyController extends Controller
{
public function anyAction()
{
// let's see what happens…
$this->anyMethodFromAnyTrait();
}
}

… и абстрактный, который расширен MyController:

abstract class Controller
{
use AnyTrait

public function anyMethodFromAnyTrait()
{
// do something different than AnyTrait
}
}

… И это то, что не работает вообще. Всякий раз, когда я звоню $this->anyMethodFromAnyTrait() в MyController метод черты, как реализовано в AnyTrait будет вызван. Метод с таким же именем в моем резюме Controller будут игнорироваться

Поэтому я могу переопределить метод черты только в конкретном подклассе, но не в абстрактном классе, который расширяется этим подклассом.

Таким образом, определения методов в признаках получают более высокий приоритет в PHP, чем те же определения методов в абстрактных классах.

Знаете ли вы какой-нибудь способ обойти это поведение?

2

Решение

Одним из обходных путей может быть использование признаков ТОЛЬКО в подклассах.
PHP всегда предпочитает методы черты над «локальными».

Причина, по которой он работает в подклассах, заключается в том, что расширен расширенный метод признаков, а не само использование признаков.

1

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

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

По вопросам рекламы ammmcru@yandex.ru
Adblock
detector