#php #validation #oop #sanitization #overriding
#php #проверка #ооп #очистка #переопределение
Вопрос:
Что вы можете сказать о проверке / очистке аргументов переопределенного метода в классе?
Если у меня есть что-то вроде
class parentClass
{
public function originalMethod($id) {
if(is_numeric($id) amp;amp; (int) $id > 0) {
// use $id
}
}
}
и подкласс, который переопределяет метод
class childClass extends parentClass
{
public function originalMethod($id) {
parent::originalMethod($id);
// do other stuff
}
}
Мой вопрос:
в каких случаях вы бы продолжили проверку аргументов метода?
Разве я не должен ожидать / предполагать, что правильная проверка уже выполнена в родительском методе?
Я когда-то видел код, в котором проверка выполняется снова (не в простом случае, подобном приведенному выше).
Вы бы проверяли каждый раз? Никогда? Только при некоторых обстоятельствах?
Ответ №1:
Обычно я использую в качестве общей направляющей линии:
- Если базовая функция вызывается в переопределенной функции в качестве первого оператора, проверка выполняется уже в переопределенной функции. В некоторых случаях необходимо добавить дополнительные проверки в переопределенную функцию. Если базовая функция не изменяет переменные, используемые для проверки, которые используются в переопределенной функции.
- Если базовая функция не вызывается, вам нужно подумать о проверке; обычно ее нужно скопировать, иногда расширить или удалить (частично).
- Если базовая функция вызывается после переопределенной функции (или не в начале), может потребоваться некоторая проверка; другая проверка будет обработана в базовой функции.
Конечно, это всего лишь руководство; могут возникать исключения.
Ответ №2:
В приведенном выше случае вы должны выполнить повторную проверку, потому что родительский элемент не прерывает выполнение вашего кода, если входные данные недопустимы. Он просто инкапсулирует свой собственный код.
В других случаях, когда у вас есть контроль над родительской функцией, и вы можете быть уверены, что она сохраняет вашу перезаписанную функцию от недопустимого ввода, вы можете пропустить тест.
Вообще говоря, я бы пересмотрел, просто чтобы быть на стороне сохранения. Если позже это станет проблемой производительности, вы можете пересмотреть этот подход в каждом конкретном случае.