Я застрял в проблеме с чертами, которые я не могу решить самостоятельно.
я имею расширение классов абстрактный класс (в моем случае это несколько классов контроллеров и абстрактный класс 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, чем те же определения методов в абстрактных классах.
Знаете ли вы какой-нибудь способ обойти это поведение?
Одним из обходных путей может быть использование признаков ТОЛЬКО в подклассах.
PHP всегда предпочитает методы черты над «локальными».
Причина, по которой он работает в подклассах, заключается в том, что расширен расширенный метод признаков, а не само использование признаков.
Других решений пока нет …