наследование — Как решить проблему алмазов в PHP?

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

У меня есть базовый класс Controller (Я не могу изменить этот класс) и иметь два подкласса SecurityController а также DevController, Каждый из этих подклассов представляет методы, которые также используют методы внутри базового класса. Тогда у меня есть последний класс ApplicationController что, в идеале, продлило бы SecurityController а также DevController, Конечно, это не возможно в PHP (только одиночное наследование).

Таким образом, мой вопрос звучит так: как лучше решить эту проблему? Я наткнулся черты но потом понял, что не работает, так как 2 подкласса (которые, как я думал, могут подходить чертам), оба должны расширяться Controller чтобы получить доступ к методам внутри него. Единственная альтернатива, которую я вижу, это принуждение SecurityController расширить DevController (или наоборот). Хотя это работает, это не идеально, так как эти два класса происходят из отдельных модулей, которые я надеялся создать как падение и использовать как есть Тип плагина.

Эта почта На обзор кода смотрится многообещающе. Хотя альтернатива была бы хороша — я чувствую, что могу внести ошибки при попытке улучшить этот код.

Примечание о решении

Принятый ответ по-прежнему остается лучшим способом решения этой проблемы в целом. Однако в этом случае я смог использовать черты. У меня был метод в SecurityController называется beforeExecute($dispatcher) — изменив его на beforeExecuteTrait($controller, $dispatcher) и делая SecurityController черта тогда имея ApplicationController простираться Controllerиспользовать SecurityController и добавив метод в ApplicationController как

public function beforeExecute($dispatcher)
{
return $this->beforeExecuteTrait($this, $dispatcher);
}

и применяя ту же логику к DevController Я добился желаемого поведения.

1

Решение

Похоже, вы могли бы извлечь выгоду из внедрение зависимости. Другими словами, вы должны создавать экземпляры других классов, а затем внедрять эти экземпляры в ваш основной класс для использования. Это позволяет избежать путаницы с наследованием в PHP.

class A extends B {

}

class C {
/** @var \A */
protected $classa;

public function __construct(\A $class) {
$this->classa = $class;
}
}

$a = new \A();
$c = new \C($a);
2

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

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

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