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

1

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

У меня есть 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 я добился желаемого поведения.

  • 0
    Как я уже сказал в вопросе - я сделал, но два класса, которые будут подходить чертам ( DevController и SecurityController ), нуждаются в доступе к методам в Controller . Если бы черта могла расширить класс, это было бы идеально ...
  • 0
    Круто, @JohnConde, почему-то я понятия не имел о чертах PHP. Спасибо!
Теги:
inheritance
diamond-problem

1 ответ

2
Лучший ответ

Похоже, вы могли бы воспользоваться инъекцией зависимости. Другими словами, вы должны создавать экземпляры других классов, а затем вводить эти экземпляры в свой основной класс для использования. Это позволяет избежать любых беспорядков с наследованием в 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);
  • 0
    Отлично! Я использовал платформу Phalcon, которая интенсивно использует это, но мне никогда не приходило в голову использовать его здесь. Я попробую это сейчас, спасибо!

Ещё вопросы

Сообщество Overcoder
Наверх
Меню