После создания MVC-структуры в PHP я столкнулся с проблемой, которая может быть легко решена с использованием дженериков стиля Java. Абстрактный класс Controller может выглядеть примерно так:
abstract class Controller {
abstract public function addModel(Model $model);
Может быть случай, когда подкласс класса Controller должен принимать только подкласс модели. Например, ExtendedController должен принимать только метод ReOrderableModel в метод addModel, поскольку он предоставляет метод reOrder(), к которому ExtendedController должен иметь доступ:
class ExtendedController extends Controller {
public function addModel(ReOrderableModel $model) {
В PHP унаследованная сигнатура метода должна быть точно такой же, поэтому подсказка типа не может быть изменена на другой класс, даже если класс наследует тип класса, намеченный в суперклассе. В java я бы просто сделал это:
abstract class Controller<T> {
abstract public addModel(T model);
class ExtendedController extends Controller<ReOrderableModel> {
public addModel(ReOrderableModel model) {
Но в PHP нет поддержки дженериков. Есть ли какое-либо решение, которое все еще будет придерживаться принципов ООП?
Edit Я знаю, что PHP не требует типа намека на всех, но это, возможно, плохой ООП. Во-первых, из интерфейса (подписи метода) не очевидно, какие объекты должны быть приняты. Поэтому, если другой разработчик захочет использовать этот метод, должно быть очевидно, что объекты типа X требуются без необходимости просмотра реализации (тела метода), которая является плохим инкапсулированием и нарушает принцип скрытия информации. Во-вторых, потому что там нет безопасности типа, метод может принимать любую недопустимую переменную, которая означает, что ручная проверка типа и бросок исключений необходимы повсюду!