对于下面的两个函数,函数A使用函数B,它们接受相同的参数 - $input。这个$input论点应该在 A 内部还是在 B 中净化?还是应该在两者中都进行消毒?(多余?
最佳编码实践是什么?谢谢!
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;
}
这样,您就不会依赖神秘的返回值来指示输入值可能存在的问题,并且可以返回实际经过净化的输入参数。