2016-08-31 4 views
1

У меня есть функция public beforeDelete() почти в каждом классе CMS. К сожалению, некоторые умные люди передо мной создали некоторые из них с параметром ($rowId) и некоторые из них без каких-либо параметров.Можно ли удалить пустую функцию в родительском классе?

Родитель Main_Admin_Module имеет пустую декларацию функции, как это:

public function beforeDelete() {} 

, но из-за этого, я получаю ошибки как

ERR: Декларация Model_EshopCategories :: beforeDelete() должен be , совместимый с версией Admin_Module_Main :: beforeDelete()

потому что (очевидно) декларация с ($rowId) не совместима с (empty).

К сожалению, это предотвращает ответы Json, поскольку тело ответа содержит ошибку и поэтому повреждено, поэтому я хочу исправить это.

Мой вопрос: могу ли я просто избавиться от родительского метода или должен ли я переписать каждый отдельный ребенок beforeDelete, чтобы исправить это? Я попытался сделать ($rowId = null) в родительском методе, и это не сработало.

+0

Какова видимость данных функций в родительском и дочернем 'public/protected/private'? – jitendrapurohit

+0

Вы должны переписать все методы и убедиться, что они все согласованы. Вы можете использовать интерфейс для обеспечения соответствия сигнатуры метода. –

+0

@jitendrapurohit public, они оба (все модели и родительская модель) public –

ответ

0

Мне кажется, что базовый метод является ненужным бременем, поскольку он ничего не делает и применяет правила, которым не могут следовать все подклассы. Особенно, если он вызывается с разными параметрами при разных обстоятельствах, этот метод не должен быть частью общего API класса Admin_Module_Main.

Мое предложение было бы удалить метод beforeDelete() от Admin_Module_Main.

Альтернативой, которая не требует, чтобы вы удаляли базовый метод, должен был пройти через каждый подкласс Admin_Module_Main и сделать параметры необязательными (плюс код, который обрабатывает значение по умолчанию в необязательном параметре). Это может быть лучшим решением в случае, если вы не знаете все о вызывающих абонентах метода beforeDelete().

+0

Могут быть веские причины, по которым этот метод существует. Например, какая-то другая часть системы может ожидать, что этот метод будет существовать. Таким образом, удаление этого означает, что каждый класс, который расширяет его, должен создать этот метод. И вы не узнаете до выполнения, если все классы, которые расширяют этот класс, определили метод. –

+0

Если есть еще одна часть системы, которая ожидает, что 'beforeDelete()' будет существовать и принять 0 параметров, программа завершится с ошибкой, если есть переопределение, которое ожидает больше 0 параметров, - и здесь есть такие случаи. Я согласен с тем, что этот метод не может быть частью 'Admin_Module_Main', если ожидаются различные числа параметров. –

+0

В дочерних методах могут быть дополнительные необязательные аргументы. См. Пример 2 http://php.net/manual/en/language.oop5.abstract.php –

-2

Одним из способов избежать этой ошибки, если вы не хотите исправлять код во всех классах, является изменение уровня error_reporting. Перейдите в конфигурацию php.ini и обновите error_reporting таким образом.

error_reporting = E_ALL & ~E_STRICT 

или сделать в коде

error_reporting(E_ALL^E_STRICT); 

уровень E_STRICT причина, почему вы видите это сообщение об ошибке.

+2

Это только скрывает проблему. –

+0

У меня он включен по умолчанию, но опять же, если я сам сделал ошибку, мне нужно обрезать его, что снова вызывает проблему с ajax и json. –

+0

Вы должны внимательно прочитать мое объяснение. Это не только скрывает проблему, она позволяет использовать этот вид кода. Если у вас есть сотни устаревших контроллеров, я желаю вам хорошего лиза, чтобы исправить все их на одной итерации. @GerardRoche –