我正在创建一个大型PHP项目,我对如何继续进行了一个微不足道的怀疑。
假设我们有一个班级books
,在这个课程中,我有方法ReturnInfo
:
function ReturnInfo($id) {
if( is_numeric($id) ) {
$query = "SELECT * FROM books WHERE id='" . $id . "' LIMIT 1;";
if( $row = $this->DBDrive->ExecuteQuery($query, $FetchResults=TRUE) ) {
return $row;
} else {
return FALSE;
}
} else {
throw new Exception('Books - ReturnInfo - id not valid.');
}
}
然后我有另一种方法PrintInfo
function PrintInfo($id) {
print_r( $this->ReturnInfo($id) );
}
显然,代码示例仅为示例而非实际生产代码。
在第二种方法中,我应该(再次)检查id是否为数字?或者我可以跳过它,因为在第一种方法中已经注意了,如果它不是例外,会被抛出吗?
直到现在我总是用冗余支票编写代码(无论是否已经在其他地方检查过,我会在这里检查 )
有最好的做法吗?只是常识吗?
提前感谢您的回复。
答案 0 :(得分:5)
好吧,通过检查每一层,问问自己获得的内容。它更安全吗?不,因为使用该值的函数(唯一一个易受攻击的函数)会自行进行检查。
它唯一的优点是你可以提前停止无效值,从而执行更少的代码。在知道值无效之前,它不必一直向下和备份。这可能是也可能不是真正的优势。
它确实会产生问题:你有更多的代码。你的代码不再干了。如果更改“有效”值的定义,则必须更改所有地方的检查。那些是更大的问题。
我会以这种方式解决问题:您的核心业务模型执行详细检查,最终负责确保值有效,并且它是唯一一个使用此值执行“危险”操作的人。外层(控制器,视图)仅传递值。除了一个例外:他们可能会进行“粗略”的数据验证。假设您的模型需要具有特定格式的电话号码。您应该在模型中检查此特定规则。在视图/控制器层中,您可以大致验证该值至少在某种程度上是数字的。说,你有一个Javascript检查。这会阻止您的核心应用程序出现错误的错误值,同时仍然可以灵活地在一个地方调整核心验证规则。
答案 1 :(得分:0)
除非您仔细检查连续执行数千次的循环内部的返回,否则您甚至不会注意冗余检查。即使这样,类型检查也是一个非常小的操作,并且比用于检索示例中的数据的SQL查询快几个数量级。
除非您真正捏住实时应用程序的CPU周期,否则您可能会享受额外检查为您提供的屁股保障。
那就是说,你的函数通常应该比它们的输出更严格地验证它们的输入,所以你要编写额外冗余检查的唯一地方就是这样的内联需要严格打字/验证的功能。