Для двух функций ниже функция A использует функцию B, и они принимают один и тот же аргумент — $ input. Должен ли этот входной аргумент $ санироваться в пределах А или В? Или это должно быть продезинфицировано в обоих? (Лишнее?)
Какова лучшая практика кодирования? Спасибо!
function A($input) {
// Sanitize $input here?
B($input);
// Does its own thing
}
function B($input) {
// Sanitize $input here?
// eg. SQL statement using the $input
eg. "SELECT * FROM table1 WHERE column1 = $input"
}
Изменить: я сделал это немного более конкретным, чтобы вы знали, что делает функция B. (допустим, например, что он использует $ input как часть оператора SQL.
Зависит от ввода и того, что вы хотите дезинфицировать. Если вы хотите продезинфицировать его в обеих функциях, тогда, по крайней мере, для дезинфекции используется третья функция. Так что он обрабатывается одинаково, и когда вам нужно изменить его, вы должны изменить его в одной точке.
Вы также можете использовать тип подсказки: PHP: Тип Хинтинг
Очистите входные данные в отдельной, возможно, закрытой, функции, вызывая ее в начале других функций, которые ее вызывают. Это позволит обеспечить согласованность, а также рефакторинг санации для этой отдельной функции снизит уровень требуемой работы, если вам потребуется добавить дополнительные функции, которые также могут потребовать санации ввода того же типа / диапазона.
Где возможно, вы должны использовать тип подсказки — Одно из преимуществ заключается в том, что современные IDE будут использовать это для всплывающих подсказок при вводе кода, который вызывает эти функции.
Кроме того, как часть санации / проверки входных значений, я бы рекомендовал бросать подклассы исключений времени выполнения, чтобы указать ошибки проверки на этом входе, например:
class My_RuntimeException extends RuntimeException {}
function A($input) {
$s = sanitise_input($input);
// do main work...
}
function B($input) {
$s = sanitise_input($input);
// do main work of this function...
}
function sanitise_input($input) {
if (!is_numeric($input)) {
throw new My_RuntimeException("$input must be numeric.");
}
if ($input < MIN_RANGE && $input > MAX_RANGE) {
throw new My_RuntimeException("$input outside of range.");
}
$sanitised = (int) $input;
return $sanitised;
}
Таким образом, вы не полагаетесь на загадочные возвращаемые значения, чтобы указать, что может быть не так с входными значениями, и вы можете вернуть действительный очищенный входной параметр.