Я искал решения проблемы с бриллиантами, но единственный, который я нашел, использует черты который я не могу использовать в моем случае, поэтому я прошу здесь посмотреть, есть ли у кого-нибудь альтернативное решение.
У меня есть базовый класс 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
Я добился желаемого поведения.
Похоже, вы могли бы извлечь выгоду из внедрение зависимости. Другими словами, вы должны создавать экземпляры других классов, а затем внедрять эти экземпляры в ваш основной класс для использования. Это позволяет избежать путаницы с наследованием в 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);
Других решений пока нет …