Правильная реализация виртуальных функций в PHP? - PullRequest
20 голосов
/ 29 августа 2009

на моем рабочем месте (только php) у нас есть базовый класс для абстракции базы данных. Если вы хотите добавить новую таблицу базы данных в базовый слой, вам нужно создать подкласс этого базового класса и переопределить некоторые методы, чтобы определить индивидуальное поведение для использования этой таблицы. Нормальное поведение должно оставаться прежним.

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

Моей первой мыслью для решения этой проблемы была мысль об абстрактных методах, которые должны быть переопределены наследованием классов. Но помимо других аргументов против абстрактных методов, «абстрактный» просто не показывает , почему базовый класс не может использоваться сам по себе, и , почему эти функции должны быть переопределены.

После некоторого поиска, я не нашел хорошего ответа на реализацию "настоящих" виртуальных функций в php (только то, что есть виртуальная функция, которая почти убивает всякую надежду на конкретную реализацию).

Итак, что бы вы сделали с этим вопросом?

Ответы [ 3 ]

31 голосов
/ 01 сентября 2009

В PHP все публичные и защищенные функции являются "виртуальными". Вы можете предотвратить переопределение функций, добавив ключевое слово final . (Или сделав их приватными, но это, вероятно, плохая идея).

При проектировании базового класса я бы подумал о поведении, на которое подклассы хотели бы повлиять. Например, я бы создал пустые функции, такие как before_update () и after_insert ().

function after_insert() {
  // Virtual
}

Какой базовый класс будет вызывать при возникновении события обновления / вставки.

Может быть, функция is_valid (), которая всегда возвращает true в базовом классе, и использовать блок комментария, чтобы описать последствия, когда подкласс возвращает false.

Надеюсь, это даст вам вдохновение.

4 голосов
/ 01 июля 2010

Вы всегда можете использовать ключевое слово "final", чтобы предотвратить переопределение некоторых функций классов, если люди используют класс неправильно.

Мне кажется, что они не могут получить определенную функциональность, следовательно, переопределяют методы. Возможно, вам придется взглянуть на дизайн ваших классов.

0 голосов
/ 29 августа 2009

Без примера реализации вашего базового класса трудно дать конкретную информацию. Но на ум приходит несколько вещей:

  1. Абстракция базы данных - сложная штука для начала. Я понимаю, что вы хотите сохранить его стройным, чистым и подлым, но я думаю, что это чертовски сложно. Вы действительно должны внимательно изучить спецификации различных механизмов БД, чтобы увидеть, какие части являются общими, а какие части требуют специализации. Также; Вы уверены, что у вас нет абстракции БД, смешанной с шаблоном Шлюз таблиц данных, поскольку вы говорите о добавлении таблиц БД путем расширения базового класса?

  2. Методы вашего текущего базового класса, возможно, делают слишком много и / или не являются достаточно общими для начала, если расширенные классы слишком сильно изгибаются назад, чтобы сохранить его в чистоте. Может быть, вам следует разбить методы интерфейса базового класса на более мелкие защищенные методы, которые являются достаточно общими для повторного использования в переопределяющих методах расширенных классов? Или наоборот: возможно, вы должны иметь хуки для переопределяемых методов в ваших интерфейсных методах.

  3. Исходя из пункта 2: что плохого в том, чтобы иметь абстрактный класс с некоторыми общими реализованными методами, и позволить вашему классу vanilla (вашему базовому классу) и другим классам наследовать от , что ?

  4. И, наконец, может быть, вам следует просто реализовать реализуемый интерфейс вместо расширения базового класса?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...