Я искал решения проблемы с алмазами, но единственное, что я нашел, это использовать черты, которые я не могу использовать в моем случае, поэтому я прошу здесь посмотреть, есть ли у кого-то альтернативное решение.
У меня есть 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);
DevController
иSecurityController
), нуждаются в доступе к методам вController
. Если бы черта могла расширить класс, это было бы идеально ...